nginx + ffmpeg = rtmp

ffmpeg

4 заметки с тегом ffmpeg


FFmpeg Cedrus H.264 Codec On H3

Cedrus – проект программного обеспечения, который является полностью 100% открытым исходным кодом драйвера для использования аппаратного ускорения видео.

Сборка FFmpeg с поддержкой Cedrus H.264
тестировал на ARMBIAN 5.25 stable Debian GNU/Linux 8 (jessie) 3.4.113-sun8i

git clone https://github.com/stulluk/FFmpeg-Cedrus.git

Применяем патч:

git clone https://github.com/uboborov/ffmpeg_h264_H3.git
cp /root/ffmpeg_h264_H3/cedrus264.c /root/FFmpeg-Cedrus/libavcodec/cedrus264.c
cp -R /root/ffmpeg_h264_H3/sunxi /root/FFmpeg-Cedrus/libavcodec/arm
apt-get install libpulse-dev libv4l-dev libmp3lame-dev libx264-dev

cd FFmpeg-Cedrus

./configure --prefix=/usr --enable-nonfree --enable-gpl --enable-version3 --enable-vdpau --enable-libx264 --enable-libmp3lame --enable-libpulse --enable-libv4l2 

make -j 4
make install
ffmpeg -version

ffmpeg version git-2015-01-22-f86a076 Copyright (c) 2000-2014 the FFmpeg developers
built on Feb 11 2017 10:31:03 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: prefix=/usr enable-nonfree enable-gpl enable-version3 enable-vdpau enable-libx264 enable-libmp3lame enable-libpulse enable-libv4l2 enable-librtmp
libavutil 54. 6.100 / 54. 6.100
libavcodec 56. 0.101 / 56. 0.101
libavformat 56. 2.100 / 56. 2.100
libavdevice 56. 0.100 / 56. 0.100
libavfilter 5. 0.102 / 5. 0.102
libswscale 3. 0.100 / 3. 0.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 0.100 / 53. 0.100


проверка :

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -pix_fmt nv12 -r 25 -c:v cedrus264 -f mpegts udp://localhost:1234

root@orangepipc:~# ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -pix_fmt nv12 -r 25 -c:v cedrus264 -f mpegts udp://192.168.0.4:8092
ffmpeg version git-2015-01-22-f86a076 Copyright (c) 2000-2014 the FFmpeg developers
built on Feb 11 2017 12:57:57 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: prefix=/usr enable-nonfree enable-gpl enable-version3 enable-vdpau enable-libx264 enable-libmp3lame enable-libpulse --enable-libv4l2
libavutil 54. 6.100 / 54. 6.100
libavcodec 56. 0.101 / 56. 0.101
libavformat 56. 2.100 / 56. 2.100
libavdevice 56. 0.100 / 56. 0.100
libavfilter 5. 0.102 / 5. 0.102
libswscale 3. 0.100 / 3. 0.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 0.100 / 53. 0.100
Input #0, video4linux2,v4l2, from ‘/dev/video0’:
Duration: N/A, start: 11274.796209, bitrate: 147456 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
[VDPAU SUNXI] VE version 0x1680 opened.
Output #0, mpegts, to ‘udp://192.168.0.4:8092’:
Metadata:
encoder : Lavf56.2.100
Stream #0:0: Video: h264 (cedrus264), nv12, 640x480, q=2-31, 200 kb/s, 25 fps, 90k tbn, 25 tbc
Metadata:
encoder : Lavc56.0.101 cedrus264
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (cedrus264))
Press [q] to stop, [?] for help
frame= 1085 fps= 25 q=30.0 Lsize= 5250kB time=00:00:43.40 bitrate= 991.0kbits/s dup=0 drop=210


fps= 25, h264-codec, приемлимая нагрузка на CPU
для проверки запустим VLC на удалённой машине и пытаемся там воспроизвести эту ахинею:

udp://@:1234 или udp://@0.0.0.0:1234

только после этого запускаем ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -pix_fmt nv12 -r 25 -c:v cedrus264 -f mpegts udp://localhost:1234, вместо localhost указываем адрес удаленной машины с VLC. На роутере надо пробросить порт 1234.

Тема на форуме armbian 



RTSP сервер средствами   ffserver  & ffmpeg

RTSP расшифровывается как Real Time Streaming Protocol — потоковый протокол реального времени — по сути это протокол управления вещанием, он позволяет выполнять несколько команд, такие как «старт», «стоп», «переход на определённое время».

Тестировал:
•Одноплатный компьютер Orange PI PC
•Web-камера LOGITECH HD Webcam C270

Важно! Камера должна на выходе иметь изображение, которое не нужно перекодировать.
Если вы запустили потоковое видео средствами  ffserver  & ffmpeg , RTSP сервер запускается после редактирования /etc/ ffserver .conf

nano /etc/ ffserver .conf

Мой /etc/ ffserver .conf

Port 8090 
RTSPPort 8091 
RTSPBindAddress 0.0.0.0 
MaxClients 100 
MaxBandwidth 20000 
<Feed feed.ffm> 
File /tmp/feed.ffm FileMaxSize 5M
Launch ffmpeg -f video4linux2 -i /dev/video0 
</Feed> 

# RTSP 

<Stream live>
Feed feed.ffm
Format rtp
VideoFrameRate 10
VideoBufferSize 2000
VideoBitRate 800
VideoQMin 1
VideoQMax 31
VideoSize 640x480
Noaudio
</Stream>

Сохраняем изменения в файле (ctrl + o) и закрываем файл (ctrl + x).

запускаем  ffserver :
опция -d отладочный режим

 ffserver  -d

rtsp://Ваш_IP:8091/live смотрим в VLC

Интересный, но мной не проверенный плеер:
HTML5 RTSP Player
поддерживает:
Browser support:
•Firefox v.42+
•Chrome v.23+
•OSX Safari v.8+
•MS Edge v.13+
•Opera v.15+
•Android browser v.5.0+
•IE Mobile v.11+

Мне был задан вопрос «Как автоматически запускать и останавливать RTSP сервер при заходе на веб страницу?»
RTSP сервер можно запускать и останавливать bash скриптом. Google в помощь.



Сервер потокового вещания средствами  ffserver  & ffmpeg

Тестировал:
•Одноплатный компьютер Orange PI PC
•Web-камера LOGITECH HD Webcam C270

Важно! Камера должна на выходе иметь изображение, которое не нужно перекодировать.

 ffserver  идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg. Каждый получаемый поток называется Feed’ом. Таких потоков может быть несколько, так же как и отдаваемых (выходных).

Сборка FFmpeg

git clone https://github.com/ua3nbw/gpiokey.git
cd gpiokey
sudo chmod -R 777 *
./build_ffmpeg.sh

Сначала настроим  ffserver , чей конфиг лежит в /etc/ ffserver .conf:

nano /etc/ ffserver .conf

Мой /etc/ ffserver .conf

Port 8090 
<Feed feed.ffm> 
File /tmp/feed.ffm FileMaxSize 5M
Launch ffmpeg -f video4linux2 -i /dev/video0 
</Feed>

<Stream live.swf>
Feed feed.ffm
Format swf # Macromedia Flash compatible stream
VideoCodec flv
VideoFrameRate 10
VideoIntraOnly
VideoBufferSize 80000
VideoBitRate 256
VideoQMin 1
VideoQMax 5
VideoSize 640x480
Noaudio
</Stream>

Сохраняем изменения в файле (ctrl + o) и закрываем файл (ctrl + x).
запускаем  ffserver :
опция -d отладочный режим

 ffserver  -d

смотрим в VLC http://Ваш_IP:8090/live.swf или устанавливаем свой сервер apache и вставляем http://Ваш_IP:8090/live.swf в html-страницу используя, ну например flowplayer



nginx + ffmpeg =  rtmp . Потоковое видео

Сборка FFmpeg
FFmpeg — это универсальный инструмент для кодирования и декодирования множества видео и аудио форматов, хотя FFmpeg и x264 есть в официальных репозитариях различных дистрибутивов, иногда возникает необходимость собирать эти пакеты самостоятельно.

apt-get update && apt-get upgrade -y
git clone https://github.com/ua3nbw/gpiokey.git
cd gpiokey
sudo chmod -R 777 *
./build_ffmpeg.sh

На OrangePI PC собирается минут 40.
синтаксис FFmpeg:
ffmpeg [опции источника] -i [источник] [основные опции] [кодеки] [преемник]
•Опции источника — указывают параметры чтения файла, настройки и так далее;
•Источник — опция -i задает источник, откуда будет читаться файл, источников может быть несколько и это может быть не только файл, но и устройство;
•Основные опции — задают параметры работы всей утилиты;
•Кодеки — кодек, который будет использоваться для сохранения видео и аудио;
•Преемник — файл или устройство, куда будут записаны данные.

Понимаем FFmpeg
Перевод документации ffmpeg на русский язык

Вывод команды ffmpeg -version

ffmpeg version N-83006-g4c63910 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --prefix=/usr --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-librtmp --enable-nonfree --enable-libfreetype --enable-libfdk-aac --enable-libmp3lame --enable-version3 --disable-mmx --enable-shared
libavutil      55. 43.100 / 55. 43.100
libavcodec     57. 70.101 / 57. 70.101
libavformat    57. 61.100 / 57. 61.100
libavdevice    57.  2.100 / 57.  2.100
libavfilter     6. 68.100 /  6. 68.100
libswscale      4.  3.101 /  4.  3.101
libswresample   2.  4.100 /  2.  4.100
libpostproc    54.  2.100 / 54.  2.100

Устанавливать nginx надо не через apt-get, а из исходников компилируем с модулем nginx-rtmp

./build_nginx.sh

Вывод команды nginx -V

nginx version: nginx/1.11.8
built by gcc 4.9.2 (Debian 4.9.2-10)
built with OpenSSL 1.0.2j  26 Sep 2016
TLS SNI support enabled
configure arguments: --with-ld-opt=-Wl,-z,relro --prefix=/usr --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --with-http_ssl_module --add-module=../nginx-rtmp-module

Далее открываем конфиг nginx расположенный /etc/nginx/nginx.conf и правим под себя. У меня он следующий…


user www-data;
worker_processes 4; # воркеры по количеству ядер процессора
pid /run/nginx.pid;
error_log  /var/log/nginx/nginx_error.log debug;
env PATH;
events {
    worker_connections 768;
}

http {
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 88;

        # rtmp stat

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # you can move stat.xsl to a different location
            root /etc/nginx/;
        }

        location / {
            rtmp_control all;
        }


        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }
    }
}

# RTMP
rtmp_auto_push on;
#rtmp_auto_push_reconnect 1s;
#rtmp_socket_dir /var/sock;
rtmp {
    access_log /var/log/nginx/rtmp_access.log;
    server {
        listen 1935;
        ping 30s;
        notify_method get;
        application myapp {
            live on;
         }

    }
}

Проверяем корректность нашего конфига nginx:

root@orangepipc:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@orangepipc:~#

Если всё ок, то запускаем nginx:

nginx

Простейшая проверка:
подключаем USB Веб камеру

ffmpeg  -i /dev/video0  -an -f flv rtmp://localhost/myapp/mystream

Потоковое rtmp видео наблюдаем по этому адресу

rtmp://Ваш_IP/myapp/mystream

Getting started with nginx rtmp

 

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru