Ускорение транскодирования ffmpeg входных файлов fullHD в hls - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь конвертировать файл 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, все стабилизировалось.

...