Я пытаюсь конвертировать файл full hd mp4 (битрейт 12Мб) в hls live stream. Выберите использование блоков по умолчанию 2se c. Я столкнулся с проблемой, которая делает невозможным онлайн-транскодирование и потоковую передачу: ffmpeg требуется более 2 секунд для создания блока HLS. Поэтому время от времени мой поток прерывается на несколько секунд или что-то еще, чтобы дождаться, когда ffpeg создаст следующий кусок.
Принять следующую команду (фрагмент bash скрипта):
args=(
-i hd.mp4
-vsync 1
-tune zerolatency
-preset ultrafast
-c:v libx264
-force_key_frames "expr:gte(t,n_forced*2)"
-crf 23
-b:v:0 768k
-vf "scale=720:trunc(ow/a/2)*2"
-b:a:0 96k
-b:v:1 1024k
-vf "scale=960:trunc(ow/a/2)*2"
-b:a:1 128k
-b:v:2 2500k
-maxrate 2800k
-bufsize 2000k
-vf "scale=1280:trunc(ow/a/2)*2"
-b:a:2 128k
-b:v:3 4000k
-maxrate 4500k
-bufsize 3800k
-map 0:a
-map 0:v
-map 0:a
-map 0:v
-map 0:a
-map 0:v
-map 0:a
-map 0:v
-f hls
-hls_list_size 4
-var_stream_map "a:0,v:0 a:1,v:1 a:2,v:2 a:3,v:3"
-master_pl_name live.m3u8
live_%v.m3u8
)
ffmpeg "${args[@]}"
Что интересно , когда я удалил фильтрацию для fullHD, другими словами удалил этот фильтр
-b:v:3 4000k
-maxrate 4500k
-bufsize 3800k
и соответствующее сопоставление потоков и ограничил максимальный вывод только до HD, все стабилизировалось.