Video Streaming Server auf einem Raspberry Pi

Die Tage kam das Thema auf einen eigenen Streaming Server aufzubauen. Wir kennen ja Youtube, Twitch, Restream.io, Twitter Periscope und viele weitere Dienste die Streaming anbieten. Was da immer auf der Strecke bleibt ist der Datenschutz und die Privatsphäre. Also muss eine eigene Lösung her.

Neue Technologie

Got sei Dank, sind wir von dem Adobe Flash Player erlöst worden und es gibt neue Möglichkeiten des Streaming auf den eigenen Server in Verbindung mit einem Webbrowser ohne Zusatzsoftware. Viele kennen die OpenSource Software OBS und benutzen diese in Zusammenhang mit den oben genannten Plattformen.

Zum Einsatz kommt RTMP mit HLS auf einem Nginx Webserver. HTTP Live Streaming (HLS) ist eines der am häufigsten verwendeten Protokolle für Video-Streaming. Auch wenn es HTTP Live Streaming heißt, wird es sowohl für On-Demand-Streaming als auch für Live-Streaming eingesetzt. HLS zerlegt Videodateien in kleinere HTTP-Dateien und wird via HTTP-Protokoll übertragen. Endgeräte aller Art laden diese HTTP-Dateien herunter und geben diese direkt als Video wieder.

Info zur eigenen Sache:

Als aktiver Leser fällt  Dir sicher auf, dass ich in den letzten Monaten nur noch Raspberry Pi Projekt mit Docker veröffentliche. Das mag den einen oder anderen Leser massiv stören, was auch ein paar Abmeldungen der Newsletter nach sich zieht. Nur ist es so dass Docker auf einem Raspberry Pi enorme Vorteile hat. Wenn der Container nicht läuft,  löscht man diesen. Ein neues Raspberry Pi Image auf der SD-Karte ist nicht nötig. Neuen Container bauen, diesen starten, fertig ist die Geschichte. Was für eine Arbeitserleichterung Docker inzwischen für mich ist. Du informierst dich ja über Neuigkeiten und Trends. Genau das mach ich, zeige Trends. Auch wenn in Kubernetes, Docker verbannt ist, bedeutet dass noch lange nicht das Docker out ist. Kubernetes baut in Zukunft eigene Container Images. Docker wurde auch erst mit einer neuen Finanzspritze unterstützt.

Wer mit Docker immer noch auf Kriegsfuß steht und sich dem Thema nicht anfreunden will oder kann, sage ich, mach es einfach mal. Setzt Dich hin und installiere “Docker”. Starte dann mit kleinen Projekten. Installiere dann Portainer und Du hast eine schöne Weboberfläche wo alles möglich ist. Der Einstieg ist wirklich einfach und lohnenswert. Verlass die alten Pfade und nimm Dir Zeit für Docker.

Anforderung

Welche Prozesse sind auf dem Streaming Server aktiv:

  • Codierung, dh. Videos werden in H.264-Codierung oder H.265-Codierung umformatiert. Viele Endgeräte ohne nötige Plugins können diese Dateien direkt ausgeben.
  • Segmentierung, dh. Video werden in Dateischnipsel auf den Server gespeichert. Die Länge kann variieren und beträgt im Standard 10 Sekunden. Eine Indexdatei z.B. stream.m3u8 wird hierfür permanent erzeugt die die Reihenfolge der Videodateien enthält. HLS erstellt Duplikate für verschiedene Video Qualitätsstufen wie z.B. 480p, 720p, 1080p und weitere.

    Bitraten-adaptives Streaming wird dadurch möglich. Die Endgeräte bestimmen die Videoqualität und nicht der Server. Dies ist vor allem bei wechselnden Datenraten im Mobilfunk sehr hilfreich, da das Video nicht abgebrochen wird, sondern je nach Netzanbindung die Qualität selbständig erhöht oder verringert.

Was wird benötigt

In diesem Fall keine SD-Karte benutzen, da massiv viele Daten auf den Speicher geschrieben und gelöscht werden. In kürzester Zeit wäre die SD-Karte kaputt. Für einen Testaufbau kann man natürlich eine SD-Karte nutzen. Für den Dauerbetrieb muss es eine SSD-Drive sein. Die Einkaufsliste oben wurde von mir verprobt und alle Komponenten sind an einem Raspberry Pi 4 fehlerfrei im Betrieb.

Ein Architekturbild

Diese soll den allgemeinen Aufbau erklären:

  1.  
Architektur Aufbau Kameras / Raspberry und HLS-Server

Installation Software

Wenn Docker erfolgreich installiert wurde nach meiner Anleitung starten wir die Vorbereitung für den Aufbau des Docker Container.

mkdir -p docker/restreamer
cd docker/restreamer

vi docker-compose.yml

Erstelle eine Datei : docker-compose.yml mit unten angezeigten Inhalt:

version: '3'
services:
  restreamer:
    container_name: restreamer
    image: datarhei/restreamer-armv7l:latest
    privileged: true
    restart: always
    environment:
      - RS_USERNAME=admin
      - RS_PASSWORD=ichbingeheim
      - RS_MODE=USBCAM
      - RS_AUDIO=acc
      - RS_USBCAM_AUDIO=true
      - RS_USBCAM_AUDIODEVICE=2
      - RS_USBCAM_AUDIOLAYOUT=mono
      - RS_USBCAM_AUDIOSAMPLING=44100
      - RS_LOGLEVEL=4
    ports:
      - 8080:8080
    devices:
      - /dev/snd
      - /dev/video0:/dev/video
    tmpfs:
      - /tmp/hls
    volumes:
      - ./data/restreamer-config:/restreamer/db

Video Support

v4l2-ctl – list-devices

Als Ausgabe sollte folgendes angezeigt werden:

bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16

eMeet Nova: eMeet Nova (usb-0000:01:00.0-1.4):
	/dev/video0
	/dev/video1

Die Ausgabe von “/dev/video0” ist das Gerät mit dem die Software mit der Kamera kommuniziert.

Audio Support

Überprüfe jetzt ob das Audiogerät vorhanden ist:

arecord – list-devices

Die Ausgabe sollte ein Audiogerät anzeigen:

**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 2: Nova [eMeet Nova], Gerät 0: USB Audio [USB Audio]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0

Das Audiogerät muss mit dem Eintrag “RS_USBCAM_AUDIODEVICE=2” übereinstimmen. Sollte hier eine andere Adresse unter “Karte” sein, dann ist dieser Eintrag zu übernehmen.

Wenn alle Parameter richtig eingetragen sind, starte den Docker Container:

docker-compose up -d
Starting restreamer ... done
docker-compose ps
   Name      Command    State                Ports
----------------------------------------------------------------
restreamer   ./run.sh   Up      0.0.0.0:8080->8080/tcp, 8181/tcp

Starte nun den Browser mit folgender URL:  http://<IP-Raspberry>:8080

Es sollte eine Login Webseite anzeigt werden:

Trage als Videoquelle folgende URL ein und klicke auf “Start”.

rtmp://127.0.0.1/live/usbcam.stream

Öffne folgende URL im Browser :

http://<IP-Raspberry>:8080/player.html

Der Screenshot oben zeigt den Load mit zwei gestarteten Docker Container. Der eine Container läuft mit der USB-Kamera und der zweite läuft mit einer IP-Kamera. Der Raspberry Pi 4 mit 4GB RAM kann das locker verarbeiten.

Unten ein Bild der Statistik Auswertung des aktuellen Stream.

Bei Fragen die Kommentarfunktion oder das Kontaktformular nutzen.

Viel Spaß beim nachbauen und anschließenden streamen, eventuell sieht man sich Online 🙂

Beste Grüße Joachim

Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Provision-Links. Wenn du auf so einen Verweislink klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine Provision. Weiterführende Infos gibt es hier unter Punkt 8 in der Datenschutzerklärung  https://blog.unixweb.de/datenschutzerklaerung/

Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.