Abgesetzte Bildausgabe-Einheit (ABE)
Abgesetzte Bildausgabe-Einheit (ABE)
(Englischer Name: Detached Display Unit)
Grundproblem
Den Grannophone-Videostream auf dem Fernseher auszugeben erfordert aktuell ein recht dickes HDMI-Kabel. Das macht das Handling des Grannophones umständlicher, als es sein muss. Außerdem stimmt dann die Kameraposition nicht mehr.
Lösungsansatz
Ein Raspberry Pi Zero 2 W(H) bekommt den Videostream vom eigentlichen Grannophone, das damit zur Abgesetzten Steuer-Einheit (ASE), englisch Detached Control Unit (DCU) wird, zugestreamt, am Besten im H.264-Format, weil der Zero 2 dafür einen Hardware-Decoder an Bord hat, und gibt diesen dann über seinen MiniHDMI-Port auf den Fernseher aus. Umgekehrt stellt er eine angeschlossene PiCam2 oder PiCam3 via UDP/IP bereit, so dass der Raspberry Pi 4B den Stream über IP abgreifen kann und man sich nicht mit V4L-Devices oder ähnlichem herumärgern muss.
Achtung, die folgende Lösung stammt aus den Antworten eines LLM, und ist ungetestet
Grundsätzliche Einrichtung
In ~/.baresip/config auf dem Pi4
Die Datei ergänzen um
video_display gst_video,udp://pizero2waddress:5000 # streamt das Bild an den Pi Zero 2 W video_source avformat,udp://1280x720@0.0.0.0:5001 # holt das Kamerabild vom Pi Zero 2 W module avcodec.so # laden und auf "H.264 bevorzugt" setzen, damit der H.264-HW-Decoder im Zero2W zum Einsatz kommen kann.
Auf dem Zero 2 W
sudo apt update && sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad
# Wenn man den Zero 2 W in den USB-Ethernet-Gadget-Modus versetzt und per USB am Pi4 anschließt, sollte das hier ausreichen: gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink # via Wifi sollte man dagegen das hier verwenden: gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,payload=96 ! rtpjitterbuffer latency=200 ! rtph264depay ! avdec_h264 ! autovideosink
# Rückkanal für die Webcam auf dem Pi Zero 2W: libcamera-vid -t 0 --inline --codec h264 --width 1280 --height 720 --framerate 30 -o udp://pi4address:5001
Startskripte für Systemd
/etc/systemd/system/hdmi-receiver.service
[Unit] Description=GStreamer HDMI Video Receiver Daemon After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/bin/gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
/etc/systemd/system/picam-streamer.service
[Unit] Description=PiCam IP Streamer to Main Host After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/bin/libcamera-vid -t 0 --inline --codec h264 --width 1280 --height 720 --framerate 30 -o udp://192.168.7.1:5001 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
Zum Installieren
sudo systemctl daemon-reload sudo systemctl enable hdmi-receiver.service picam-streamer.service sudo systemctl start hdmi-receiver.service picam-streamer.service
Startskripte für SysVinit
/etc/init.d/hdmi-receiver
#!/bin/sh
### BEGIN INIT INFO
# Provides: hdmi-receiver
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: GStreamer HDMI Video Receiver Daemon
### END INIT INFO
PIDFILE=/var/run/hdmi-receiver.pid
DAEMON=/usr/bin/gst-launch-1.0
DAEMON_ARGS="udpsrc port=5000 ! application/x-rtp,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink"
case "$1" in
start)
echo "Starting HDMI Receiver..."
start-stop-daemon --start --background --make-pidfile --pidfile "$PIDFILE" --exec "$DAEMON" -- $DAEMON_ARGS
;;
stop)
echo "Stopping HDMI Receiver..."
start-stop-daemon --stop --pidfile "$PIDFILE" --retry 5
rm -f "$PIDFILE"
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
/etc/init.d/picam-streamer
#!/bin/sh
### BEGIN INIT INFO
# Provides: picam-streamer
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: PiCam IP Streamer to Main Host
### END INIT INFO
PIDFILE=/var/run/picam-streamer.pid
DAEMON=/usr/bin/libcamera-vid
DAEMON_ARGS="-t 0 --inline --codec h264 --width 1280 --height 720 --framerate 30 -o udp://192.168.7.1:5001"
case "$1" in
start)
echo "Starting PiCam Streamer..."
start-stop-daemon --start --background --make-pidfile --pidfile "$PIDFILE" --exec "$DAEMON" -- $DAEMON_ARGS
;;
stop)
echo "Stopping PiCam Streamer..."
start-stop-daemon --stop --pidfile "$PIDFILE" --retry 5
rm -f "$PIDFILE"
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
Zum Installieren
sudo chmod +x /etc/init.d/hdmi-receiver /etc/init.d/picam-streamer sudo update-rc.d hdmi-receiver defaults sudo update-rc.d picam-streamer defaults