Debian 8.4 / Raspbian 8.0
Nginx 1.9.15
ffmpeg 2.6.8 (po stronie serwera) / avconv 11.6-6: 11.6-1 ~ deb8u1 + rpi1 (zbieranie z kamery). Avconv jest widelcem FFMPEG, działa dobrze na raspbian.
Schemat przepływu
cam-1: raspberry pi / model B / raspbian 8.0 (Jessie) / avconv
mercure: serwer debian 8.4 (Jessie) / nginx / ffmpeg
cam-1 [rapivid | avconv (ffmpeg)] -> mercure [nginx rtmp / hls]
Od 2 tygodni dużo czytałem w Internecie na temat ustawiania serwera przesyłania strumieniowego wideo na żywo, który odbierał strumienie wideo z kamery Raspberry Pi. nie martw się o źródło strumieniowe malin, problem nie jest skupiony na. Celem jest możliwość odczytu strumieni na żywo RTMP i HLS na zdalnym serwerze NGINX
fakty :
Działa, jestem w stanie odczytać transmisję na żywo z serwera RTMP / NGINX za pośrednictwem
ffplay rtmp://mercure/live/cam-1 (defaults to 1935 port)
Uwaga : nie używa VLC i aplikacji QT5 osadzającej widżety QMediaPlayer / QMediaContent. Dowiedziałem się, że VLC wprowadza problemy z plikiem librtmp.so w debianie i wydaje się być takie samo w Windows 7 (test również się nie udaje). źródło: blog debian. Problem QT5 jest może efektem ubocznym, ponieważ QT5 może korzysta z biblioteki VLC? Nadal badam. Komponenty QT5 mogą odczytywać dowolny plik wideo dysku, ale zawieszają się na pierwszym obrazie podczas przesyłania strumieniowego za pomocą rtmp
Moduł Nginx hls jest zainstalowany.
Aparat (Raspberry Pi)
Aby podłączyć strumień wideo z kamery i opublikować go na serwerze rtmp NGINX za pomocą pakietów raspivid i avconv (widelec FFMPEG), użyte polecenie to:
wyciągnij z krzywki zgrzytu (cam-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 -
push na serwer RTMP (mercure)
avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1
kompletne polecenie osadzone w usłudze debian jest wtedy
/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
Strona serwera RTMP / HTTP
Wydaje się, że wszystkie posty dotyczą tego typu konfiguracji (fragment /etc/nginx.conf). Działa to podczas czytania czystych strumieni rtmp za pośrednictwem ffplay, jak wspomniano powyżej
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 *;
}
}
}
Naprawdę nie rozumiem, jak nginx działa z hls ... czy strumień przychodzący z avconv (ffmpeg) jest dynamicznie przesyłany do aplikacji / hls rtmp? po odebraniu strumienia kamery tworzony jest folder / tmp / hls wraz z plikiem cam-1-0.ts ... ale nic więcej ... brak indeksu m3u8 ...
Próba uzyskania dostępu do zasobu hls za pomocą http: // mercure / hls / cam-1 (.m3u8, .m3u ...) i odpowiedzią jest błąd 404 HTTP: standardowe zachowanie HTTP.
Próbowałem nakarmić aplikację / hls rtmp, zmieniając sekcję konfiguracji na żywo rtmp
application live {
live on;
exec ffmpeg -i rtmp://mercure/live/cam-1 -c copy -f flv rtmp://mercure/hls/cam-1;
}
Absolutnie nie jestem pewien, czy nginx może zarządzać strumieniami HLS, podczas gdy dokumentacja mówi o tym.
Moje pytanie brzmi: czy ktoś naprawdę udaje się opublikować przychodzące źródło flv do strumienia HLS przy użyciu transportu FFMPEG i serwera NGINX / http - rtmp (/ hls / dash)?