Я пытаюсь создать несколько сценариев автоматизации для перекодирования видео с помощью 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 секунды, изображение останавливается.
Мне интересно, может ли кто-нибудь помочь мне понять, что происходит и как это исправить.