Как передавать потоковое видео нескольким адресатам с помощью ffmpeg

#ffmpeg #video-streaming #ubuntu-16.04

#ffmpeg #потоковое видео #ubuntu-16.04

Вопрос:

Я хочу транслировать свое видео в 4 места назначения. Мой входной сигнал должен быть перекодирован в «H.264 AAC», поэтому я хочу отправить его на свой сервер. Это уже работает.

 Client -> Server with ffmpeg -> Destinations
  

Теперь у меня проблема с производительностью: нужно получить поток в 1080p и два в 720p.

Поэтому имело бы смысл сначала получить поток в желаемых форматах H.264 1080p и AAC с частотой 30 кадров в секунду, а затем один раз рассчитать поток и отправить его 1: 1 двум HD-целям.

и параллельно создайте поток 720p и отправьте его двум оставшимся адресатам.

Каков наилучший способ сделать это на компьютере с Ubuntu 16.04?

Мой предыдущий подход:

 ffmpeg -i rtmp://livestream.domain.example/live/<key> 
-threads 2 -s hd1080 -preset veryfast -f flv rtmp://destination1.example/live2/<key> 
-threads 2 -s hd1080 -preset veryfast -f flv rtmp://destination2.example/live2/<key> 
-threads 1 -s hd720 -c:v libx264 -c:a aac -preset veryfast -r 30 -g 60 -b:v 3000k -f flv rtmp://destination3.example/x/<key> 
-threads 1 -s hd720 -c:v libx264 -preset veryfast -c:a aac -f flv 'rtmps://destination4.exmple/rtmp/<key>'
  

Вы можете видеть повторения в коде. :-/

Ответ №1:

Используйте мультиплексор tee:

 ffmpeg -i rtmp://livestream.domain.example/live/<key> 
-filter_complex "[0:v]scale=-2:1080,fps=30,split=outputs=2[1080a][1080b];[0:v]scale=-2:720,fps=30,split=outputs=2[720a][720b]" 
-map "[1080a]" -map "[1080b]" -map "[720a]" -map "[720b]" -map 0:a 
-c:v libx264 -c:a aac -preset veryfast -g 60 -b:v 3000k -maxrate 3000k -bufsize 6000k -f tee 
"[select='v:0,a':f=flv:onfail=ignore]rtmp://destination1.example/live2/<key>| 
 [select='v:1,a':f=flv:onfail=ignore]rtmp://destination2.example/live2/<key>| 
 [select='v:2,a':f=flv:onfail=ignore]rtmp://destination3.example/live2/<key>| 
 [select='v:3,a':f=flv:onfail=ignore]rtmp://destination4.example/live2/<key>"