NGINX / RTMP / HLS-Livestream auf Raspberry-Pi (Debian 8.4)

5397
Emmanuel

Debian 8.4 / Raspbian 8.0

Nginx 1,9,15

ffmpeg 2.6.8 (serverseitig) / avconv 11.6-6: 11.6-1 ~ deb8u1 + rpi1 (Kamera sammeln). Avconv ist eine FFMPEG-Gabel, die auf Raspbian gut funktioniert.


Ablaufschema

cam-1: himbeer-pi / modell b / raspbian 8.0 (jessie) / avconv

mercure: debian server 8.4 (Jessie) / nginx / ffmpeg

cam-1 [rapivid | avconv (ffmpeg)] -> mercure [nginx rtmp / hls]


Ich habe seit 2 Wochen im Web viel darüber gelesen, wie ein Live-Video-Streaming-Server eingerichtet wurde, der Video-Streams von einer Himbeer-Pi-Kamera erhielt. Machen Sie sich keine Sorgen über die Himbeer-Streaming-Quelle, das Problem ist nicht angesprochen. Ziel ist es, RTMP- und HLS-Live-Streams auf dem Remote-NGINX-Server lesen zu können

die Fakten :

Es funktioniert, ich kann den Livestream vom RTMP / NGINX-Server über lesen

ffplay rtmp://mercure/live/cam-1 (defaults to 1935 port) 

Hinweis : VLC und eine QT5-App, die Widgets für QMediaPlayer / QMediaContent enthält, werden nicht verwendet. Ich habe herausgefunden, dass VLC Probleme mit librtmp.so unter Debian einführt und anscheinend auf Windows 7 identisch ist (Test schlägt ebenfalls fehl). Quelle: Debian-Blog. Das QT5-Problem ist möglicherweise ein Nebeneffekt, da QT5 möglicherweise die vlc-Bibliothek verwendet. Ich recherchiere immer noch. Die QT5-Komponenten können alle Festplatten-Videodateien lesen, aber beim ersten Streaming mit RTMP das erste Bild einfrieren

Das Nginx-hls-Modul ist installiert.

Kamera (Himbeer-Pi)

Um den Videostream von der Kamera zu verbinden und auf dem NGINX RTMP-Server mit den Paketen raspivid und avconv (The FFMPEG fork) zu veröffentlichen, wird folgender Befehl verwendet:

Ziehen Sie von der Raspelnocke (Nocke 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 auf den RTMP-Server (mercure)

avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1 

Der vollständige Befehl, der in einen Debian-Dienst eingebettet ist, lautet dann

/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-Serverseite

Alle Posts scheinen bei diesem Konfigurationstyp angegeben zu sein (/etc/nginx.conf-Auszug). Das funktioniert beim Lesen von reinen RTMP-Strems via ffplay wie oben erwähnt

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 *;  }  } } 

Ich verstehe nicht wirklich, wie Nginx mit hls arbeitet ... wird der eingehende Stream von avconv (ffmpeg) dynamisch in die / hls rtmp-Anwendung verschoben? Wenn der Kamerastream empfangen wird, wird der Ordner / tmp / hls zusammen mit einer cam-1-0.ts-Datei erstellt .. aber sonst nichts ... kein m3u8-Index ...

Versuch, mit http: // mercure / hls / cam-1 (.m3u8, .m3u ...) auf die hls-Ressource zuzugreifen, und die Antwort ist ein 404-HTTP-Fehler: HTTP-Standardverhalten.

Ich habe versucht, die / hls-rtmp-Anwendung zu füttern, indem ich den Live-rtmp-Konfigurationsabschnitt geändert habe

application live {  live on; exec ffmpeg -i rtmp://mercure/live/cam-1 -c copy -f flv rtmp://mercure/hls/cam-1;  } 

Ich bin absolut nicht sicher in der Nginx-Fähigkeit, HLS-Streams zu verwalten, während die Dokumentation darauf verweist.

Meine Frage ist: Gelingt es wirklich jemandem, eingehende FLV-Quelle mithilfe eines FFMPEG-Transports und des NGINX / http-rtmp (/ hls / dash) -Servers in HLS-Stream zu veröffentlichen?

0

1 Antwort auf die Frage

0
The Beach. Today.

Setup: raspivid -> ffmpeg -> rtmp -> hls [ts / m3u8] -> VideoJS

Das NGINX RTMP HLS-Setup ist sehr unkompliziert, daher werde ich das nicht durchgehen. Ich benutze hls_fragment size von 250ms und hls_playlist von 3s. Sie können gerne meinen NGINX RTMP HLS-Server verwenden. Kopieren Sie einfach und fügen Sie genau das ein, was sich im RTMP-Bereich befindet, ändern Sie jedoch 'stream_name' in etwas Einzigartiges. Ändern Sie auf ähnliche Weise das in VideoJS, damit Sie es auf Ihrer Webseite abspielen können. Ich kann nicht garantieren, dass die 2a-Anwendung für immer existiert, aber ich habe vor, meine Anwendung für eine Weile zu testen.

  1. Nur Video, A raspivid -n -t 0 -h 480 -w 854 -fps 24 -b 1536000 -o - | ffmpeg -i - -c: v copy -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Vorteile: Einfachste, solide Qualität, keine Pufferung. Nachteile: ~ 10s Latenz
  2. Nur Video, B raspivid -n -t 0 -h 480 -w 854 -fps 15 -b 1080000 -o - | ffmpeg -i - -c: v copy -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Vorteile: Niedrige Latenzzeit unter 5s. Nicht so gut: Pufferung, Quality
  3. Video und Audio [USB über Sabrent und billiges 3,5-mm-Mikrofon] raspivid -n -t 0 -h 480 -w 854 -fps 25 -b 2000000 -o - | ffmpeg -thread_queue_size 512 -i - -itsoffset 00: 00: 05.22 -f alsa -ac 1 -i hw: 0,0 -map 0: 0 -map 1: 0 -c: a aac -c: v copy -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Vorteile: Qualität, keine Pufferung, synchronisiertes Audio / Video. Nachteile: Hohe Bitrate [nicht gut für mehrere Geräte mit gleicher Bandbreite], Latenz ~ 12s - 15s

VideoJS:

 <!--Note, you should including the following in the HEAD of your HTML file:  <link href="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> --> <div class="container" id="videojs_container"> <section class="starter-template"> <video id=video-js-player width=854 height=480 class="video-js vjs-default-skin" controls autoplay="true" data-setup="{}" preload="auto"> <source src = "http://streaming.sensored.solutions/2a/stream_name/index.m3u8" type = "application/x-mpegURL"> </video> </section> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/js/bootstrap.min.js"></script> <script src="http://videojs.github.io/videojs-contrib-hls/js/ie10-viewport-bug-workaround.js"></script> <link href="//vjs.zencdn.net/5.4/video-js.css" rel="stylesheet"> <script src="//vjs.zencdn.net/5.4/video.js"></script> <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/videojs-contrib-hls/dist/videojs.hls.min.js"></script>