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.
Hallo Alex, ich bin zufällig auf Dein Tutorial gestossen, ich bin schon lange auf der Suche nach einer vernüftigen Lösung für mein Raspi Cam-Modul V3.
Ich habe einige Raspis am laufen mit motioneyos aber als mit dem Cam Modul2…
Prinzipiell finde ich Deinen Ansatz den nativen h264 Stream übers Netz zu übertragen eine Super-Idee. Es hakt bei mir nur etwas mit der Einrichtung:
Ich hänge an der Stelle den Stream zum laufen zu bekommen:
Ich habe mir den Befehl so angepasst: (ohne Audiodaten)
libcamera-vid -t 0 –width 1920 –height 1080 –hdr 0 –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-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 “rtmp://192.168.1.155/home/pi/test” – Das Verzeichnis /home/pi/test ist vorhanden.
Das ist der output nach starten der Zeile:
pi@raspi:~ $ libcamera-vid -t 0 –width 1920 –height 1080 –hdr 0 –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-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 “rtmp://192.168.1.155/home/pi/test”
[2:52:17.759304595] [1335] INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f
[2:52:17.897189443] [1336] INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx708@1a to Unicam device /dev/media4 and ISP device /dev/media2
[2:52:17.897280605] [1336] INFO RPI pipeline_base.cpp:1101 Using configuration file ‘/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml’
Mode selection:
SRGGB10_CSI2P 1536×864 – Score: 4200
SRGGB10_CSI2P 2304×1296 – Score: 3150
SRGGB10_CSI2P 4608×2592 – Score: 35342.8
[2:52:17.904346960] [1335] INFO Camera camera.cpp:1033 configuring streams: (0) 1920×1080-YUV420 (1) 2304×1296-SBGGR10_CSI2P
[2:52:17.904814913] [1336] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx708@1a – Selected sensor format: 2304×1296-SBGGR10_1X10 – Selected unicam format: 2304×1296-pBAA
[h264_v4l2m2m @ 0xd28f70] <<< v4l2_encode_init: fmt=181/0
[h264_v4l2m2m @ 0xd28f70] Using device /dev/video11
[h264_v4l2m2m @ 0xd28f70] driver 'bcm2835-codec' on card 'bcm2835-codec-encode' in mplane mode
[h264_v4l2m2m @ 0xd28f70] requesting formats: output=YU12 capture=H264
Output #0, flv, to '':
Stream #0:0: Video: h264 (h264_v4l2m2m) (High), drm_prime(tv, bt709), 1920×1080, q=-1–1, 6200 kb/s, 30 fps, 30 tbr, 1000k tbn
terminate called after throwing an instance of 'std::runtime_error'
what(): libav: unable to open output mux for : No such file or directory
Abgebrochen
Diese Zeile verstehe ich nicht: Output #0, flv, to '':
Hier müsste doch eigentlich der Pfad aus dem Befehl stehen?!
Oder bin ich auf der falschen Spur?
Gruß aus Thüringen
Torsten
Hi Torsten,
danke für deinen Comment!
Es sieht so aus, als ob du nicht alle FFmpeg Libs installiert hast bei dir. Welche Distrib nutzt du? Direkt Raspi OS oder ein anderes Derivat?
Check mal mit “ffmpeg -codecs” welche Codecs du als Video out und in hast und welche outputs dir zur Verfügung stellen.
Falls du keine FLV erzeugen (oder wie bei dir muxen [Video und Audio zusammenführen]) kannst, dann installiere entweder die entsprechenden libav Teile oder baue die einen FFmpeg selbst.
Im Regelfall funktioniert meine Methode aber auch mit den Standard FFmpeg Varianten die mit jeder Distrib ausgeliefert werden.
Liebe Grüße!