Abgesetzte Bildausgabe-Einheit (ABE)

Aus Grannophone
Zur Navigation springenZur Suche springen

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