Я пытаюсь создать несколько сценариев автоматизации для перекодирования видео с помощью ffmpeg, и я вижу, что ключевые кадры оказываются в неправильных местах, когда установлен формат HLS. Это происходит с разными источниками (например, с 4k исполнением Big Buck Bunny). Я использую статически скомпилированную версию ffmpeg 4.1 от Джона Вансикля.

Когда я транскодирую в mp4/h264, ключевые кадры находятся в ожидаемом временном коде (каждые 2 секунды). Это команда, которую я запускаю:

ffmpegparams="-c:a aac -ar 22050 -c:v libx264 -profile:v high 
              -level 4.1 -crf 20 -r 30 -g 180 -keyint_min 30 
              -force_key_frames expr:gte(t,n_forced*2)"
ffmpeg -hide_banner -y -i video.mp4 \
  -vf scale=w=640:h=360:force_original_aspect_ratio=decrease $ffmpegparams \
  -b:v 400k -maxrate 428k -bufsize 600k -b:a 64k video-360p.mp4 \
  -vf scale=w=854:h=480:force_original_aspect_ratio=increase $ffmpegparams \
  -b:v 600k -maxrate 652k -bufsize 900k -b:a 64k video-480p.mp4 \
  -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease $ffmpegparams \
  -b:v 1000k -maxrate 1070k -bufsize 1500k -b:a 96k video-720p.mp4

И команда, которую я запускаю, чтобы увидеть ключевые кадры

 ffprobe -v error -skip_frame nokey -show_entries frame=pkt_pts_time \
         -select_streams v -of csv=p=0 video-360p.mp4

какие выводы

0.000000
2.000000
4.000000
[...]

Когда я перекодирую то же видео в ts/x264 (HLS), ключевые кадры сдвигаются на 1,466 секунды. Это команда, которую я использую (та же проблема возникает, если выходные данные сегментированы, а не в одном файле)

ffmpegparams="-c:a aac -ar 22050 -c:v libx264 -profile:v high -level 4.1 
              -crf 20 -r 30 -g 180 -keyint_min 30 
              -force_key_frames expr:gte(t,n_forced*2) -hls_time 6 
              -hls_playlist_type vod -hls_flags single_file"
ffmpeg -hide_banner -y -i video.mp4 \
  -vf scale=w=640:h=360:force_original_aspect_ratio=decrease $ffmpegparams \
    -b:v 400k -maxrate 428k -bufsize 600k -b:a 64k \
    -hls_segment_filename "video-360p.ts" video-360p.m3u8 \
  -vf scale=w=854:h=480:force_original_aspect_ratio=increase $ffmpegparams \
    -b:v 600k -maxrate 652k -bufsize 900k -b:a 64k \
    -hls_segment_filename "video-480p.ts" video-480p.m3u8 \
  -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease $ffmpegparams \
    -b:v 1000k -maxrate 1070k -bufsize 1500k -b:a 64k \
    -hls_segment_filename "video-720p.ts" video-720p.m3u8

И запустив ffprobe для любого из файлов ts , я получаю следующие временные коды для ключевых кадров:

1.466667
3.466667
5.466667
[...]

когда я играю в любой из файлов ts первые 1,46 секунды, изображение останавливается.

Мне интересно, может ли кто-нибудь помочь мне понять, что происходит и как это исправить.

0