Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| hardware:video-pis [2024/04/03 19:13] – wtf | hardware:video-pis [2026/08/13 08:46] (current) – [Video-Pis] clarifcation of current RPi4-scope wtf | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | = Video-Pis | + | # Video-Pis |
| - | Research-documentation for H264-encoding and streaming with Raspberry Pis. | + | Research-documentation for H264-encoding and streaming with Raspberry Pis. Document created when RPi 4 was new, so these examples incorporate hardware-encoding and need adaption for RPi 5. |
| - | == gstreamer with Auvidea B101 HDMI-CSI2-Bridge | + | ## gstreamer with Auvidea B101 HDMI-CSI2-Bridge |
| * max. supported resolution: 1080p30. [[https:// | * max. supported resolution: 1080p30. [[https:// | ||
| Line 11: | Line 11: | ||
| Hint: For better reading pipelines are described as pipeline files which one can use with `cat pipeline-file.txt | xargs gst-launch-1.0`. | Hint: For better reading pipelines are described as pipeline files which one can use with `cat pipeline-file.txt | xargs gst-launch-1.0`. | ||
| - | === SMPTE2022-1 FEC streaming (multicast/ | + | ### SMPTE2022-1 FEC streaming (multicast/ |
| Since 2020 there is an implementation of SMPTE 2022-1 in gstreamer, done in MPEGTS via UDP with 2D-FEC: [[https:// | Since 2020 there is an implementation of SMPTE 2022-1 in gstreamer, done in MPEGTS via UDP with 2D-FEC: [[https:// | ||
| Line 27: | Line 27: | ||
| Sender, using audio from HDMI-In and sending video-input to first HDMI-display port: | Sender, using audio from HDMI-In and sending video-input to first HDMI-display port: | ||
| - | + | < | |
| - | ``` | + | rtpbin |
| - | rtpbin | + | name=rtp |
| - | name=rtp | + | fec-encoders=' |
| - | fec-encoders=' | + | |
| - | + | v4l2src | |
| - | v4l2src | + | device=/ |
| - | device=/ | + | io-mode=0 |
| - | io-mode=0 | + | do-timestamp=true |
| - | do-timestamp=true | + | ! " |
| - | ! " | + | ! tee |
| - | ! tee | + | name=input |
| - | name=input | + | ! v4l2h264enc |
| - | ! v4l2h264enc | + | output-io-mode=0 |
| - | output-io-mode=0 | + | extra-controls=" |
| - | extra-controls=" | + | ! " |
| - | ! " | + | ! h264parse |
| - | ! h264parse | + | ! mpegtsmux |
| - | ! mpegtsmux | + | name=mux |
| - | name=mux | + | ! rtpmp2tpay |
| - | ! rtpmp2tpay | + | ssrc=0 |
| - | ssrc=0 | + | ! rtp.send_rtp_sink_0 |
| - | ! rtp.send_rtp_sink_0 | + | |
| - | + | rtp.send_rtp_src_0 | |
| - | rtp.send_rtp_src_0 | + | ! udpsink |
| - | ! udpsink | + | host=224.0.23.1 |
| - | host=224.0.23.1 | + | port=5000 |
| - | port=5000 | + | multicast-iface=eth0 |
| - | multicast-iface=eth0 | + | |
| - | + | rtp.send_fec_src_0_0 | |
| - | rtp.send_fec_src_0_0 | + | ! udpsink |
| - | ! udpsink | + | host=224.0.23.1 |
| - | host=224.0.23.1 | + | port=5002 |
| - | port=5002 | + | async=false |
| - | async=false | + | multicast-iface=eth0 |
| - | multicast-iface=eth0 | + | |
| - | + | rtp.send_fec_src_0_1 | |
| - | rtp.send_fec_src_0_1 | + | ! udpsink |
| - | ! udpsink | + | host=224.0.23.1 |
| - | host=224.0.23.1 | + | port=5004 |
| - | port=5004 | + | async=false |
| - | async=false | + | multicast-iface=eth0 |
| - | multicast-iface=eth0 | + | |
| - | + | alsasrc | |
| - | alsasrc | + | device=hw: |
| - | device=hw: | + | do-timestamp=true |
| - | do-timestamp=true | + | ! " |
| - | ! " | + | ! audioconvert |
| - | ! audioconvert | + | ! voaacenc |
| - | ! voaacenc | + | bitrate=48000 |
| - | bitrate=48000 | + | ! aacparse |
| - | ! aacparse | + | ! queue |
| - | ! queue | + | ! mux. |
| - | ! mux. | + | |
| - | + | input. | |
| - | input. | + | ! queue |
| - | ! queue | + | ! videoconvert |
| - | ! videoconvert | + | ! fbdevsink |
| - | ! fbdevsink | + | device="/ |
| - | device="/ | + | sync=false |
| - | sync=false | + | </ |
| - | ``` | + | |
| Receiver, with audio-out on Headphone-jack: | Receiver, with audio-out on Headphone-jack: | ||
| - | ``` | + | < |
| - | rtpbin | + | rtpbin |
| - | latency=100 | + | latency=100 |
| - | fec-decoders=' | + | fec-decoders=' |
| - | name=rtp | + | name=rtp |
| - | + | ||
| - | udpsrc | + | udpsrc |
| - | address=224.0.23.1 | + | address=224.0.23.1 |
| - | port=5002 | + | port=5002 |
| - | caps=" | + | caps=" |
| - | ! queue | + | ! queue |
| - | ! rtp.recv_fec_sink_0_0 | + | ! rtp.recv_fec_sink_0_0 |
| - | + | ||
| - | udpsrc | + | udpsrc |
| - | address=224.0.23.1 | + | address=224.0.23.1 |
| - | port=5004 | + | port=5004 |
| - | caps=" | + | caps=" |
| - | ! queue | + | ! queue |
| - | ! rtp.recv_fec_sink_0_1 | + | ! rtp.recv_fec_sink_0_1 |
| - | + | ||
| - | udpsrc | + | udpsrc |
| - | address=224.0.23.1 | + | address=224.0.23.1 |
| - | port=5000 | + | port=5000 |
| - | caps=" | + | caps=" |
| - | ! queue | + | ! queue |
| - | ! netsim | + | ! netsim |
| - | drop-probability=0.01 | + | drop-probability=0.01 |
| - | ! rtp.recv_rtp_sink_0 | + | ! rtp.recv_rtp_sink_0 |
| - | + | ||
| - | rtp. | + | rtp. |
| - | ! queue | + | ! queue |
| - | ! decodebin | + | ! decodebin |
| - | name=decode | + | name=decode |
| - | ! videoconvert | + | ! videoconvert |
| - | ! queue | + | ! queue |
| - | ! kmssink | + | ! kmssink |
| - | + | ||
| - | decode. | + | decode. |
| - | ! audioconvert | + | ! audioconvert |
| - | ! queue | + | ! queue |
| - | ! alsasink | + | ! alsasink |
| - | card-name=" | + | card-name=" |
| - | ``` | + | </ |
| - | === SRT streaming (unicast), audio and display-loop-out included | + | ### SRT streaming (unicast), audio and display-loop-out included |
| * Tested by wtf with an Raspberry Pi 4B+ with Raspberry Pi OS 2023-10-10, Debian Bookworm each, in March 2024. | * Tested by wtf with an Raspberry Pi 4B+ with Raspberry Pi OS 2023-10-10, Debian Bookworm each, in March 2024. | ||
| Line 145: | Line 144: | ||
| Sender, using audio from HDMI-In and sending video-input to display: | Sender, using audio from HDMI-In and sending video-input to display: | ||
| - | ``` | + | < |
| - | v4l2src | + | v4l2src |
| - | device=/ | + | device=/ |
| - | io-mode=0 | + | io-mode=0 |
| - | do-timestamp=true | + | do-timestamp=true |
| - | ! " | + | ! " |
| - | ! tee | + | ! tee |
| - | name=input | + | name=input |
| - | ! v4l2h264enc | + | ! v4l2h264enc |
| - | output-io-mode=0 | + | output-io-mode=0 |
| - | extra-controls=" | + | extra-controls=" |
| - | ! " | + | ! " |
| - | ! mpegtsmux | + | ! mpegtsmux |
| - | name=mux | + | name=mux |
| - | ! srtsink | + | ! srtsink |
| - | uri=srt://: | + | uri=srt://: |
| - | latency=40 | + | latency=40 |
| - | mode=listener | + | mode=listener |
| - | wait-for-connection=true | + | wait-for-connection=true |
| - | + | ||
| - | input. | + | input. |
| - | ! queue | + | ! queue |
| - | ! videoconvert | + | ! videoconvert |
| - | ! fbdevsink | + | ! fbdevsink |
| - | sync=false | + | sync=false |
| - | + | ||
| - | alsasrc | + | alsasrc |
| - | device=hw: | + | device=hw: |
| - | do-timestamp=true | + | do-timestamp=true |
| - | ! " | + | ! " |
| - | ! audioconvert | + | ! audioconvert |
| - | ! voaacenc | + | ! voaacenc |
| - | bitrate=48000 | + | bitrate=48000 |
| - | ! aacparse | + | ! aacparse |
| - | ! queue | + | ! queue |
| - | ! mux. | + | ! mux. |
| - | ``` | + | </ |
| Receiver, with audio-out on Headphone-jack: | Receiver, with audio-out on Headphone-jack: | ||
| - | ``` | + | < |
| - | srtclientsrc | + | srtclientsrc |
| - | latency=20 | + | latency=20 |
| - | mode=caller | + | mode=caller |
| - | uri=srt:// | + | uri=srt:// |
| - | ! tsdemux | + | ! tsdemux |
| - | latency=40 | + | latency=40 |
| - | name=demux | + | name=demux |
| + | |||
| + | demux. | ||
| + | ! queue | ||
| + | ! decodebin | ||
| + | name=decode | ||
| + | ! videoconvert | ||
| + | ! queue | ||
| + | ! kmssink | ||
| + | |||
| + | demux. | ||
| + | ! queue | ||
| + | ! avdec_aac | ||
| + | ! audioconvert | ||
| + | ! alsasink | ||
| + | card-name=" | ||
| + | </ | ||
| - | demux. | + | ### RIST streaming (multicast/ |
| - | ! queue | + | |
| - | ! decodebin | + | |
| - | name=decode | + | |
| - | ! videoconvert | + | |
| - | ! queue | + | |
| - | ! kmssink | + | |
| - | + | ||
| - | demux. | + | |
| - | ! queue | + | |
| - | ! avdec_aac | + | |
| - | ! audioconvert | + | |
| - | ! alsasink | + | |
| - | card-name=" | + | |
| - | ``` | + | |
| - | + | ||
| - | === RIST streaming (multicast/ | + | |
| RIST seems to be the new kid around the corner of SRT. No FEC, but re-transmission-requests with RTCP, which shall work via multicast, too? | RIST seems to be the new kid around the corner of SRT. No FEC, but re-transmission-requests with RTCP, which shall work via multicast, too? | ||
| Line 220: | Line 219: | ||
| Sender, using audio from HDMI-In and sending video-input to display: | Sender, using audio from HDMI-In and sending video-input to display: | ||
| - | ``` | + | < |
| - | v4l2src | + | v4l2src |
| - | device=/ | + | device=/ |
| - | io-mode=0 | + | io-mode=0 |
| - | do-timestamp=true | + | do-timestamp=true |
| - | ! " | + | ! " |
| - | ! tee | + | ! tee |
| - | name=input | + | name=input |
| - | ! v4l2h264enc | + | ! v4l2h264enc |
| - | output-io-mode=0 | + | output-io-mode=0 |
| - | extra-controls=" | + | extra-controls=" |
| - | ! " | + | ! " |
| - | ! mpegtsmux | + | ! mpegtsmux |
| - | name=mux | + | name=mux |
| - | ! rtpmp2tpay | + | ! rtpmp2tpay |
| - | ! ristsink | + | ! ristsink |
| - | address=224.0.23.1 | + | address=224.0.23.1 |
| - | port=5004 | + | port=5004 |
| - | multicast-iface=eth0 | + | multicast-iface=eth0 |
| - | + | ||
| - | input. | + | input. |
| - | ! queue | + | ! queue |
| - | ! videoconvert | + | ! videoconvert |
| - | ! fbdevsink | + | ! fbdevsink |
| - | sync=false \ | + | sync=false \ |
| - | + | ||
| - | alsasrc | + | alsasrc |
| - | device=hw: | + | device=hw: |
| - | do-timestamp=true | + | do-timestamp=true |
| - | ! " | + | ! " |
| - | ! audioconvert | + | ! audioconvert |
| - | ! voaacenc | + | ! voaacenc |
| - | bitrate=48000 | + | bitrate=48000 |
| - | ! aacparse | + | ! aacparse |
| - | ! queue | + | ! queue |
| - | ! mux. | + | ! mux. |
| - | ``` | + | </ |
| Receiver, with audio-out on headphone-jack: | Receiver, with audio-out on headphone-jack: | ||
| - | ``` | + | < |
| - | ristsrc | + | ristsrc |
| - | address=224.0.23.1 | + | address=224.0.23.1 |
| - | receiver-buffer=200 | + | receiver-buffer=200 |
| - | reorder-section=20 | + | reorder-section=20 |
| - | ! rtpmp2tdepay | + | ! rtpmp2tdepay |
| - | ! tsdemux | + | ! tsdemux |
| - | latency=50 | + | latency=50 |
| - | name=demux | + | name=demux |
| - | + | ||
| - | demux. | + | demux. |
| - | ! queue | + | ! queue |
| - | ! decodebin | + | ! decodebin |
| - | name=decode | + | name=decode |
| - | ! videoconvert | + | ! videoconvert |
| - | ! queue | + | ! queue |
| - | ! kmssink | + | ! kmssink |
| - | + | ||
| - | demux. | + | demux. |
| - | ! queue | + | ! queue |
| - | ! avdec_aac | + | ! avdec_aac |
| - | ! audioconvert | + | ! audioconvert |
| - | ! alsasink | + | ! alsasink |
| - | card-name=" | + | card-name=" |
| - | ``` | + | </ |