Raspberry Pi Zero 2W, Debian Bookworm und libcamera (Module 2 & 3) Streaming

Der effizienteste Weg, einen qualitativ hochwertigen Videostream von Ihrem Kameramodul zu erhalten und ihn über ein Netzwerk zu übertragen. Sowohl das Raspberry Camera Module 2 als auch das Module 3 können bereits direkt h264-Streams generieren.

Der effizienteste Weg, einen qualitativ hochwertigen Videostream von Ihrem Kameramodul zu erhalten und ihn über ein Netzwerk zu übertragen.

Sowohl das Raspberry Camera Module 2 als auch das Module 3 können bereits direkt h264-Streams generieren. Der effizienteste Weg, einen qualitativ hochwertigen Videostream von Ihrem Kameramodul zu erhalten und ihn über ein Netzwerk zu übertragen. Sowohl das Raspberry Camera Module 2 als auch das Module 3 können bereits direkt h264-Streams auf dem Kameraprozessor generieren. Im neuen Raspberry OS, basierend auf Debian 12 Bookworm, wurde der libcamera-Stack entfernt, und rpicam-vid ist die Anwendung, nach der Sie suchen sollten, wenn Sie auf Ihr Kameramodul zugreifen möchten. Aus Kompatibilitätsgründen ist libcamera-vid ein symbolischer Link zu rpicam-vid.

which libcamera-vid 
ll /usr/bin/libcamera-vid 
lrwxrwxrwx 1 root root 10 Nov 23 16:35 /usr/bin/libcamera-vid -> rpicam-vid

Was wir wollen: Erstellen Sie einen hochwertigen h264-Stream und übertragen Sie diesen über ein Netzwerk in motion oder motionplus für die Bewegungserkennung (oder jede andere Software, Speicherung, Anwendung, Server).

Schwierigkeiten: CPU-Leistung, RAM-Nutzung, Netzwerkbandbreitengrenzen, instabile WLAN-Signale, Speicherprobleme.

Unsere Lösung: Erstellen Sie einen hochwertigen h264 an der Quelle, verwenden Sie eine geringere CPU-Auslastung beim Neuverpacken und Verarbeiten des Streams, verwenden Sie stabile Server-Stacks und Module für die Netzwerkübertragung, erkennen Sie Bewegungen aus hochwertigem Video und sparen Sie Speicherplatz und verwenden Sie keine Video-Codierleistung in Motion und MotionPlus, geben Sie einfach das h264 durch.

Raspberry Camera Module 3 Wide Um die Fähigkeiten Ihres Kamerasensors zu sehen, installieren Sie v4l-utils:

sudo apt-get install v4l-utils

Und überprüfen Sie Ihre Videogeräte auf Ihrem System:

v4l2-ctl --list-devices v4l2-ctl --list-formats

Installieren Sie nun Ihre rpicam-apps, indem Sie (oder libcamera-apps bei einem normalen Debian 12, nicht dem Raspberry OS) Folgendes eingeben:

sudo apt rpicam-apps

Und erstellen Sie ein Bash-Skript, das Sie als Befehl ausführen können:

sudo nano stream.sh

Fügen Sie die folgende Zeile in stream.sh für ein Raspberry Camera Module 2 ein (in diesem Beispiel ohne eine Audioquelle; fügen Sie bei Bedarf Ihre eigene hinzu):

#!/bin/bash
rpicam-vid -t 0 --width 1920 --height 1080 --nopreview --exposure long \ 
 --sharpness 1.2 --contrast 1.4 --brightness 0.2 --saturation 1.0 \
--awb auto --denoise auto --rotation 0 --codec libav --libav-format flv \
 -n --framerate 30 -b 3200000 --autofocus-mode auto \
 --inline -o "rtmp://192.168.yy.xx/pi/test"

Oder diese Zeile für ein Raspberry Camera Module 3 (in diesem Beispiel mit einer USB-Audioquelle; fügen Sie bei Bedarf Ihre eigene hinzu):

#!/bin/bash libcamera-vid -t 0 --width 1920 --height 1080 --hdr 0 --nopreview \          --exposure long --sharpness 1.2 --contrast 1.4 --brightness 0.2 --saturation 1.0 \  --awb auto --denoise auto --profile high --level 4.2 --codec libav --libav-audio \ --audio-source alsa --audio-device hw:0,0 --audio-channels 1 --audio-codec aac \--audio-samplerate 48000 --audio-bitrate 128000 --av-sync 0 --libav-format flv \-n --framerate 30 -b 6200000 --autofocus-mode manual --lens-position 0.5 \ --autofocus-window 0.25,0.25,0.5,0.5 --save-pts timestamp.pts --inline \ -o "rtmp://192.168.yy.xx/pi/test"

Vergessen Sie nicht, die IP-Adresse Ihres RTMP-Servers zu bearbeiten. Es spielt keine Rolle, ob Sie libcamera-vid oder rpicam-vid verwenden, da es der gleiche Prozess ist.

In beiden Dateien erstellen wir einen h264-Videostream mit 30 Bildern pro Sekunde, passen Belichtung, Schärfe, Kontrast und Helligkeit an, fügen eine Audioquelle hinzu oder lassen sie weg, und übergeben die Ausgabe des Sensors an eine Neupackung des rohen h264-Streams in das libav-Framework (tatsächlich das FFmpeg-Framework), um den rohen h264 in einen FLV-Container zu integrieren. Dieser Container wird dann zu einer Zielmaschine gestreamt, auf der wir höchstwahrscheinlich motion oder motionplus ausführen. Bitte passen Sie Ihre Ziel-IP im Skript an, um Ihre Nginx RTMP-Server-IP zu erreichen, der den Stream dann wieder aufnimmt.

Beachten Sie, dass ich den Fokuspunkt der Kamera fixiert habe und die Autofokus-Funktion nicht verwende. Der Autofokus führt zu viel Fokuspumpen durch, wenn die Lichtverhältnisse nicht optimal sind, was dann die Bewegungserkennung in Motion und MotionPlus auslöst. Also habe ich es ausgeschaltet, da die Blende der Kamera Objekte im Hintergrund nicht zu sehr unscharf macht.

Nun benötigen wir auf der “anderen Seite” etwas, das unseren Videostream akzeptiert und ihn in eine Anwendungsschicht einließt. Es gibt viele RTMP-Server da draußen, aber für Linux-Bequemlichkeit verwende ich Nginx mit seinem RTMP-Modul. Installieren Sie Nginx und das RTMP-Modul auf Ihrem Zielserver:

sudo apt install nginx-common nginx-core libnginx-mod-rtmp

Bearbeiten Sie dann Ihre /etc/nginx/nginx.conf-Datei:

nano /etc/nginx/nginx.conf

Und fügen Sie diese Zeilen am Ende hinzu:

rtmp {
server {
    listen 1935;
    timeout 60s;
    notify_method post;
    chunk_size 4096;
application pi {
live on;
record off;
}

Starten Sie den Nginx-Server neu:

sudo service nginx restart

An diesem Punkt durchläuft Ihr Videostream bereits drei Verarbeitungsstufen, wobei die Verarbeitungsleistung auf drei verschiedene Prozessoren verteilt ist. Der Kamer-Sensor selbst und sein Prozessor-Backend, der Raspberry Pi, der den RAW h264 in einen FLV-Container verpackt, und die Zielmaschine mit dem empfangenden Nginx-Server, bereit für die Wiedergabe oder Abholung von Motion oder MotionPlus (die sich auf demselben Computer oder sogar auf einem anderen entfernten Computer befinden können, der das Videosignal von nginx mit dem netcam_url-Modul abholt).

Fügen Sie abschließend eine camera1.conf-Datei in Ihr /etc/motionplus-Konfigurationsverzeichnis ein. Kopieren Sie diese Zeilen:

; /usr/local/etc/motionplus/camera1.conf
;
; This config file was generated by motionplus 0.1.1-git-20230823-1f228cd

;*************************************************
; Configuration options specific to camera 1
;*************************************************

;*************************************************
;*****   Camera
;*************************************************
device_name PiCam
device_id 101
track_type 0

;*************************************************
;*****   Source
;*************************************************
netcam_url rtmp://192.168.178.25/pi/test
track_type 0

;*************************************************
;*****   Image
;*************************************************
width 1920
height 1080
framerate 30

;*************************************************
;*****   Overlays
;*************************************************
text_left PiCam_HD
text_right PiCam_HD\n%Y-%m-%d\n%T-%q
text_scale 3
;*************************************************
;*****   Movie
;*************************************************
movie_filename PiCam_%t-%v-%Y_%m_%d_%H_%M_%S

Und starten Sie Ihre Motion- oder MotionPlus-Instanz neu. Fertig! Sie erstellen nun einen hochwertigen (nun ja, es sind immer noch Raspberry-Videokameramodule!) h264-Rohstream, verpacken ihn in einen FLV-Container, spielen ihn auf einen nginx-RTMP-Streaming-Server aus, der von Ihrer Motion- oder MotionPlus-Instanz aufgenommen wird. Und das alles, ohne die Rechengrenzen eines der Komponenten zu brechen. Selbst der winzige Raspberry Zero 2W lächelt bei etwa 10% CPU-Auslastung.

Raspberry Zero 2W Wenn etwas schief gelaufen ist, hier sind einige Tipps zur Fehlerbehebung:

Sie können jederzeit überprüfen, wo der Stream gestoppt ist. Überwachen Sie Ihren Raspberry mit htop oder bpytop, um zu sehen, ob ein Prozess mit libcamera oder rpicam-vid existiert. Wenn nicht, versuchen Sie, den libcamera- oder rpicam-vid-Befehl manuell mit allen Optionen auszuführen. Dies sollte Ihnen einige lesbare Fehlerausgaben geben. Auf der nginx/RTMP-Zielmaschine können Sie auch die Netzwerknutzung überprüfen (z. B. mit bpytop), wenn die Maschine einen Stream empfängt. H264 ist, je nach Datenrate, die Sie im obigen Shell-Skript gewählt haben, recht groß. Wenn netzwerktechnisch auf der Maschine nichts anderes passiert, sollten Sie eine Netzwerkaktivität vom Stream sehen. Wenn Sie unsicher sind, stoppen Sie Ihr stream.sh-Skript und sehen Sie die Netzwerkraten sinken. Von dort aus können Sie auch einen Videoplayer verwenden, der in der Lage ist, Netzströme aufzunehmen, z. B. VLC, und den Netzwerkstream laden:

rtmp://192.168.y.x/pi/test

Warten Sie einige Sekunden (RTMP ist nicht in Echtzeit!) und überprüfen Sie Ihr Bild. Und die letzte Stufe der Fehlerbehebung bezieht sich dann auf MotionPlus selbst.

One thought on “Raspberry Pi Zero 2W, Debian Bookworm und libcamera (Module 2 & 3) Streaming

Leave a Reply

Your email address will not be published. Required fields are marked *