2016-04-11 4 views
0

Я получаю вход rtmp с видео и стерео аудио. Мне нужно разделить аудио и отправить два видео с левого канала и на правый канал на разных адресах. У меня есть такая команда:Оптимизация разделения и передачи звука ffmpeg

ffmpeg -r 25 -loop 1 -i background.png \ 
-rtbufsize 2000M -i rtmp://stereoinput \ 
-filter_complex "[1:v][0:v]overlay[video];[video]split[video][video2];[1:a]channelsplit[aleft][aright]" \ 
-map [video] -map [aleft] -c:v libx264 -minrate 1000k -maxrate 1500k -b:v 1300k -bufsize 1000k \ 
-pix_fmt yuv420p -r 25 -g 100 -tune zerolatency -preset ultrafast \ 
-c:a libmp3lame -ar 44100 -y -f flv rtmp://out_left \ 
-map [video2] -map [aright] -c:v libx264 -minrate 1000k -maxrate 1500k -b:v 1300k -bufsize 1000k \ 
-pix_fmt yuv420p -r 25 -g 100 -tune zerolatency -preset ultrafast \ 
-c:a libmp3lame -ar 44100 -y -f flv rtmp://out_right 

Но он работает медленно: он выводит только 20 кадров в секунду. Я кодирую на лазурной VPS с 4 ГБ оперативной памяти и 4 ядрами и никогда не думал, что может возникнуть такая проблема. Он отлично кодирует один поток.

У вас есть идеи, как сделать это быстрее? Для примера, мне также не нравится, что мне нужно дважды закодировать один и тот же видеопоток. Я не могу позволить себе две команды, потому что мне нужно увидеть весь вывод команды.

ответ

0

Используйте псевдомаксер tee, который позволяет вам кодировать поток один раз и повторно использовать его несколько раз.

ffmpeg -r 25 -loop 1 -i background.png \ 
-rtbufsize 2000M -i rtmp://stereoinput \ 
-filter_complex "[1:v][0:v]overlay[video];[1:a]channelsplit[aleft][aright]" 
-map [video] -map [aleft] -map [aright] 
-c:v libx264 -minrate 1000k -maxrate 1500k -b:v 1300k -bufsize 1000k -pix_fmt yuv420p 
-r 25 -g 100 -tune zerolatency -preset ultrafast -c:a libmp3lame -ar 44100 -y 
-f tee "[f=flv:select=v,\'a:0\']rtmp://out_left|[f=flv:select=v,\'a:1\']rtmp://out_right" 

ВЫБРАТЬ выражение в тройнике мультиплексоре относится к преобразованным выходным потокам, таким образом a:1 означает, отображенный поток аудио выхода 2-й и v означает, что все отображенные выходные потоки видео.

+0

Я попытался использовать tee более простым способом, как 'ffmpeg -i input.mp4 -c copy -f tee [f = flv] rtmp:/out1 | [f = flv] rtmp:// out2 "' on Win it просто говорит: 'Выходной файл # 0 не содержит никакого потока' даже с' loglevel verbose', на Ubuntu работает, но .. Например youtube говорит, что он получает поток, но не запускает трансляцию , а другой проигрыватель по обслуживанию показывает только черный экран. Ffplay поймать его успешно. – Ngoral

+0

В этом конкретном случае это зависит от того, соответствует ли кодировка flv. Вы попробовали мою команду выше? – Mulvya

+0

Да, я пробовал и фактически не получал видео, только звук. – Ngoral

Смежные вопросы