Debian 8.4 / Raspbian 8.0
Nginx 1.9.15
ffmpeg 2.6.8 (на стороне сервера) / avconv 11.6-6:11.6-1 ~ deb8u1+rpi1 (сбор камеры). Avconv - это FFMPEG-форк, он отлично работает на raspbian.
Схема потока
cam-1: малиновый пи / модель B / малиновый 8,0 (Джесси) / avconv
mercure: сервер Debian 8.4 (Джесси) / nginx / ffmpeg
Cam-1 [Rapivid | avconv (ffmpeg)] -> mercure [nginx rtmp / hls]
За 2 недели я прочитал много постов в Интернете о настройке сервера потокового видео в реальном времени, который принимал видеопотоки от камеры Raspberry Pi. не беспокойтесь о потоковом источнике малины, проблема не в этом. Цель состоит в том, чтобы иметь возможность читать живые потоки RTMP и HLS на удаленном сервере NGINX
факты :
Это работает, я могу читать прямой эфир с сервера RTMP/NGINX через
ffplay rtmp://mercure/live/cam-1 (defaults to 1935 port)
примечание : он не использует VLC и приложение QT5, в которое встроены виджеты QMediaPlayer / QMediaContent. Я обнаружил, что VLC создает проблемы с librtmp.so в debian и, похоже, то же самое в окне 7 (тест также не проходит). Источник: блог Debian. Возможно, проблема QT5 является побочным эффектом, поскольку QT5, возможно, использует библиотеку vlc? Я все еще расследую. Компоненты QT5 могут читать любой видеофайл на диске, но останавливаться на первом изображении при потоковой передаче по rtmp.
Модуль Nginx hls установлен.
Камера (малиновый пи)
Чтобы подключить видеопоток с камеры и опубликовать его на сервере NGINX rtmp с помощью пакетов raspivid и avconv (форк FFMPEG), используйте следующую команду:
вытянуть из рашпиля кулачок (кулачок-1):
/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o -
нажать на RTMP-сервер (Mercure)
avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1
полная команда, встроенная в сервис Debian,
/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o - | avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1
RTMP / HTTP серверная часть
Кажется, что все сообщения о состоянии этого типа конфигурации (/etc/nginx.conf выдержка). Это работает при чтении чистых rtmp-потоков через ffplay, как упомянуто выше.
rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
}
}
http {
server {
server_name mercure;
location / {
root /var/www;
index index.html;
}
location /hls{
types {
video/MP2T ts;
application/vnd.apple.mpegurl m3u8;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
}
Я не очень понимаю, как nginx работает с hls ... входящий поток из avconv (ffmpeg) динамически передается в приложение /hls rtmp? при получении потока с камеры создается папка /tmp /hls вместе с файлом cam-1-0.ts ... но ничего больше ... без индекса m3u8 ...
Попытка получить доступ к ресурсу hls с помощью http://mercure/hls/cam-1 (.m3u8, .m3u ...), и в результате получается ошибка 404 HTTP: стандартное поведение http.
Я попытался скормить приложение /hls rtmp, изменив раздел конфигурации live rtmp
application live {
live on;
exec ffmpeg -i rtmp://mercure/live/cam-1 -c copy -f flv rtmp://mercure/hls/cam-1;
}
Я абсолютно не уверен в способности nginx управлять потоками HLS, в то время как документация указывает на это.
Мой вопрос: кому-нибудь действительно удается опубликовать входящий источник flv в поток HLS, используя транспорт FFMPEG и сервер NGINX / http - rtmp (/ hls / dash)?