ffmpeg потоковое вещание для чайников

В этой статье я попытаюсь рассказать начинающему пользователю Linux о потоковом вещании в сеть с помощью ffmpeg. На первый взгляд тема простая и все понятно. Вот есть видео, вот ffmpeg его транслирует, пользователи подключаются и начинают смотреть киношку. Как телевышка и телевизоры. Но как только я решил, что-то транслировать то сразу уперся в стену непонимания и недостатка информации. Как транслировать? Куда вещать? Как подготовить медиаконтент для трансляции? Многие руководства в сети начинались со слов «тут все элементарно». Часто вся инструкция сводилась к набору действий: «скачай», «установи», «поправь конфиги», «перезапусти» и вот ты уже вещаешь. Но полной картины для понимания процесса не было.


Для организации трансляции будем использовать проверенную связку ffmpeg + nginx. Что такое nginx и для чего он нужен увидите дальше.

Устанавливаем ffmpeg

Первым делом скачиваем и устанавливаем ffmpeg. Без него, как сами понимаете, ничего не получится. Как это делается я подробнейше описал в статье ffmpeg для начинающих. А лучше взять и собрать его из исходников, тем самым получив самую свежайшую версию именно для вашего дистрибутива Linux.

Поднимаем nginx

Nginx популярнейший web server в сети Internet. Многие любят его за надежность, масштабируемость и за невысокую требовательность к ресурсам. Nginx будет выступать в роли той самой телевышки о которой я говорил вначале. Именно nginx будет «вещать в эфир», а ffmpeg будет «набрасывать» ему контент для вещания.
Nginx будем собирать из исходников. Но перед этим сначала скачаем plugin RTMP для nginx, который необходим для организации вещания. Делаем клон репо с github:

git clone git://github.com/arut/nginx-rtmp-module.git

Затем скачиваем исходники самой свежей версии nginx:

wget http://nginx.org/download/nginx-1.17.1.tar.gz

Распаковываем и начинаем собирать по классической схеме:
configure&make&make install
При запуске configure необходимо указать, где находится rtmp module (plugin):

./configure  --add-module=../nginx-rtmp-module \
--sbin-path=/usr/sbin/nginx \
--lock-path=/var/run/nginx.lock \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx.pid \
--user=nginx \
--group=nginx \
--with-http_auth_request_module \
--with-http_degradation_module \
--with-http_geoip_module \
--with-http_ssl_module  \
--with-http_stub_status_module \
--with-http_v2_module \
--with-stream_ssl_module \
--with-stream \
--with-threads \
--prefix=/etc/nginx

Далее запускаем сборку и установку:

make
sudo make install

После того, как инсталляция nginx в систему будет завершена, правим файл сервиса (должен иметь следующий вид):

sudo vim  /lib/systemd/system/nginx.service
[Unit]
  Description=nginx - high performance web server
  Documentation=https://nginx.org/en/docs/
  After=network.target remote-fs.target nss-lookup.target
  Wants=network-online.target
        [Service]
  Type=forking
  PIDFile=/run/nginx.pid
  ExecStartPre=/usr/bin/rm -f /run/nginx.pid 
  ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
  ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
  ExecReload=/bin/kill -s HUP $MAINPID
  KillSignal=SIGQUIT
  TimeoutStopSec=5
  KillMode=process
  PrivateTmp=true
     [Install]
  WantedBy=multi-user.target

В конфиг nginx добавляем секцию модуля rtmp:

/etc/nginx/nginx.conf

rtmp {
        server {
                listen 1935;
                chunk_size 4096;

                application live {
                        live on;
                        record off;
                }
        }
}

И наконец-то запускаем сам nginx:

$ sudo systemctl daemon-reload
$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Nginx должен сервить порт 1935, проверяем это следующей командой:

netstat -an | egrep 1935

Замечание

Nginx может быть запущен, как на отдельном хосте в Internet, так и на том же хосте (например localhost), где будет запущен ffmpeg.

Запускаем потоковое вещание

После того, как ffmpeg и nginx установлены и сконфигурированы, можно начинать транслировать в эфир. Для этого запускаем ffmpeg на вашем локальном компьютере со следующими параметрами:

Трансляция видео

ffmpeg -i how-to-train-your-dragon-3-trailer-2_h1080p.mov -pix_fmt yuv420p -vcodec libx264 -b:v 500k -crf 35 -intra-refresh 1 -g 1 -filter:v scale=640:-1 -r 3 -preset veryfast -tune zerolatency -f flv "rtmp://123.456.78.90/live"

Разберем поподробнее опции, которые используются непосредственно для трансляции.

  • -preset veryfast — рекомендуется всегда сжимать видеопоток с опцией veryfast.Делается это для того, чтобы нагрузка на процессор при раскодировании потокового видео была небольшой;
  • -tune zerolatency — чтобы избежать лагов при передаче по сети;
  • rtmp://123.456.78.90/live — адрес nginx сервера, который будет «вещать» в эфир.

Трансляция статичной картинки

Для отладки можно запустить трансляцию статичной картинки:

ffmpeg -loop 1 -f image2 -i img.jpg -pix_fmt yuv420p -vcodec libx264 -b:v 500k -crf 35 -intra-refresh 1 -g 1 -filter:v scale=640:-1 -r 3 -preset veryfast -tune zerolatency -f flv "rtmp://123.456.78.90/live"

Трансляция изображения с web-камеры

ffplay -i /dev/video0 -c:v copy -f flv  "rtmp://123.456.78.90/live""

Смотрим трансляцию

Медиа поток, который вещает nginx в эфир можно просматривать с помощью плееров (smplayer, vlc и так далее). Но мы будем использовать ffplay, который входит в пакет FFmpeg.

ffplay -fflags nobuffer -i "rtmp://123.456.78.90/live"

На следующей картинке показаны все компоненты вместе:
ffmpeg готовящий контент для трансляции;
nginx вещающий в эфир;
клиенты, которые присоединяются к nginx и смотрят «киношку».

Кстати, фото в самом начале статье, где девушка говорит в громкоговоритель, очень наглядно иллюстрирует схему ffmpeg+nginx:
ffmpeg — микрофон в который говорит девушка;
nginx — рупор.

Выводы

В этой статье мы рассмотрели процесс вещания мультимедиа-контента в эфир. Используя бесплатную и свободнораспространяемую программу ffmpeg а так же бесплатный веб сервер nginx вы сможете без труда начать транслировать в сеть. Все что было разобрано в статье было реализовано для Linux CentOS и без труда может быть перенесено на Ubuntu или любой другой дистрибутив.

Почитать еще: