FFMPEG HLS — только создание плейлиста или прогнозирование времени сегментов перед кодированием

FFMPEG HLS — только создание плейлиста или прогнозирование времени сегментов перед кодированием

Я использую ffmpeg для создания системы перекодирования видео по запросу, которая обслуживает медиаданные через формат HLS.

Сейчас я могу перекодировать видео и обслуживать его в том виде, в котором оно закодировано, но я не могу использовать функцию поиска моих плееров, потому что плейлист (.m3u8) генерируется только по мере кодирования фрагментов. Я пробовал использовать параметры -g, установив его на 90 с длиной фрагмента 3 с и 30 кадров в секунду (29,7 кадров в секунду, если быть точным). Но фактическая длина фрагмента немного колеблется. Я также пробовал устанавливать флаг HLS round_durations, но плеер не работает с ним.

Зависят ли размеры фрагментов от сцен, которые он транскодирует, или возможно, проверив файл, быстро определить его шаблон и сгенерировать виртуальный .m3u8 в самом начале? Или есть ли возможность заставить ffmpeg генерировать плейлист без фактического кодирования файлов?

Вот команда, которую я использую прямо сейчас: (несколько строк для ясности)

ffmpeg.exe -i input.mkv -c:v libx264 -c:a aac -crf 22 -preset faster
-format hls -sn -hls_time 3 -hls_base_url http://localhost/media/
-hls_list_size 0 -hls_flags split_by_time -hls_playlist_type event -g 90 -r 30 index.m3u8

решение1

Если вы каким-либо образом вручную не задаете ритм ключевых кадров, расположение выходных ключевых кадров невозможно угадать без пропуска кадров через кодер.

Вы можете добиться более точного размещения ключевых кадров, опустив -gи добавив-force_key_frames expr:gte(t,n_forced*3)

Связанный контент