我怎样才能使用 gstreamer 将 4 个视频作为 1 个,左边 1 个大,右边 3 个小(这些应该有 1 个在另一个上面)?

How can I have 4 videos as 1 using gstreamer, with 1 large to the left and 3 smaller to the right (these should have 1 above the other)?

这就是我想要实现的目标

我一直在尝试使用 videobox 插件,但我得到的只是 4 个大小相同的框

所以这在很大程度上取决于您想要做什么以及如何做。例如,这可以是简单的 GUI 应用程序,在 4 个不同的表面上显示 4 个视频,GUI 负责布局。

如果您真的想创建一个包含这 4 个视频流的新的单个图像,那么 videomixer 听起来是个不错的选择。看这里的一些例子:

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/gst-plugins-good-plugins-videomixer.html

我之前用 3 个摄像头做过类似你描述的事情。

这是我用的管道:

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw, width=800,  height=480,  framerate=25/1 ! alpha alpha=1.0 ! videobox left=-800 ! videomixer name=mix sink_00::xpos=0 sink_01::xpos=800 sink_02::xpos=0 sink_02::ypos=480 sink_00::alpha=1.0 sink_01::alpha=1.0 sink_02::alpha=1.0 ! videoconvert ! xvimagesink \
               v4l2src device=/dev/video1 ! video/x-raw, width=1600, height=1200, framerate=25/1 ! alpha alpha=1.0 ! videobox border-alpha=0 top=-480  ! mix. \
               v4l2src device=/dev/video2 ! video/x-raw, width=800,  height=480,  framerate=25/1 ! alpha alpha=1.0 ! videobox border-alpha=0 left=-00  ! mix. -e

您需要为每个视频捕获使用一个 videobox 元素(在本例中我使用 v4l2src 但是您也可以使用其他来源,例如 filesrc ! decodebin 或网络来源)管道并将它们合并到 videomixer 元素中。

在我的例子中,我在左侧使用了一个视频,在右侧使用了两个视频,但是您可以调整 videoboxsink_0x::xpos' and 'sink_0x::ypos 元素的 lefttop 参数videomixer 元素。

记得给每个频道添加alpha,否则你的视频将是透明的。

我使用类似的东西将 运行 流混合成一个流

/usr/local/bin/gst-launch-1.0 -vv -e videomixer name=mix background=2 \
        sink_0::alpha=1.0 \
        sink_0::ypos=0 \
        sink_0::xpos=0 \
        sink_1::alpha=1.0 \
        sink_1::ypos=80 \
        sink_1::xpos=40 \
        sink_2::alpha=1.0 \
        sink_2::ypos=80 \
        sink_2::xpos=410 \
        sink_3::alpha=1.0 \
        sink_3::ypos=80 \
        sink_3::xpos=780 \
        sink_0::zorder=1 \
        sink_1::zorder=3 \
        sink_2::zorder=3 \
        sink_3::zorder=4 \
        ! clockoverlay auto-resize=false draw-shadow=false draw-outline=false halignment=left valignment=top \
        ! timeoverlay auto-resize=false draw-shadow=false draw-outline=false halignment=left valignment=bottom \
        ! queue \
            ! nvh264enc preset=1 bitrate=1500 rc-mode=2 gop-size=10 \
            ! h264parse config-interval=-1 \
            ! mpegtsmux ! rtpmp2tpay pt=33 \
            ! udpsink host=239.255.42.61 port=5004 multicast-iface=10g-1 ttl=4 ttl-mc=4 \
        multifilesrc location=/IMG/logo.jpg caps="image/jpeg,framerate=1/1" \
            ! jpegdec ! videoconvert ! videoscale \
                ! video/x-raw,width=1920,height=1080 \
            ! mix.sink_0 \
        udpsrc multicast-group=239.255.42.60 address=239.255.42.60 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
                ! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
            ! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
            ! video/x-raw,width=360,height=240 \
                ! mix.sink_1 \
        udpsrc multicast-group=239.255.42.57 address=239.255.42.57 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
                ! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
            ! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
            ! video/x-raw,width=360,height=240 \
            ! mix.sink_2 \
        udpsrc multicast-group=239.255.42.62 address=239.255.42.62 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
                ! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
            ! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
            ! video/x-raw,width=360,height=240 \
            ! mix.sink_3 \