有两个问题。
1) 主要问题是“videomixer”只有一个 src pad。您将它连接到两个焊盘。
-
gst-launch-1.0 -e \
videomixer name=mix \
sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0\
sink_1::xpos=0 sink_1::ypos=0 \
sink_2::xpos=200 sink_2::ypos=0 \
sink_3::xpos=0 sink_3::ypos=100 \
sink_4::xpos=200 sink_4::ypos=100 \
! xvimagesink
通过这样做,您将 videomixer src_pad 连接到 Sixvimagesink 的 sink pad
最后,您再次尝试使用队列和其他元素将 videomixer src_ 连接到 rtmpsink。
所以你必须删除其中一个连接。
如果您不想连接到 xvimagesink,只需删除“!xvimagesink”
如果您不想连接到 rtmpsink,请删除“混合!队列!视频转换 ...”部分。
2) 如果要保留与队列的连接,则存在以下问题。
您正在将 mix.sink_4 连接到 mix.src。
... ! mix.sink_4 \
! mix. ! queue ! videoconvert ! ...
删除第一个“!”和 ”。”在最后一行。
... ! mix.sink_4 \
mix ! queue ! videoconvert ! ...
那么它应该不会给出语法错误。
编辑 1
我再次认为你犯了一个错误。您正在将 mix 的 src 连接到 mix.sink_0。我已经更正了。
gst-launch-1.0 -e \
videomixer name=mix \
sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0\
sink_1::xpos=0 sink_1::ypos=0 \
sink_2::xpos=200 sink_2::ypos=0 \
sink_3::xpos=0 sink_3::ypos=100 \
sink_4::xpos=200 sink_4::ypos=100 \
\ /* You should not add "! .mix.sink_0" here. */
rtmpsrc location='rtmp://streaming.example.com:1935/209147924'\
! decodebin ! videoconvert ! videoscale \
! video/x-raw,width=200,height=100 \
! mix.sink_1 \
rtmpsrc location='rtmp://streaming.example.com:1935/209147925'\
! decodebin ! videoconvert ! videoscale \
! video/x-raw,width=200,height=100 \
! mix.sink_2 \
rtmpsrc location='rtmp://streaming.example.com:1935/209147926'\
! decodebin ! videoconvert ! videoscale \
! video/x-raw,width=200,height=100 \
! mix.sink_3 \
rtmpsrc location='rtmp://streaming.example.com:1935/209147927'\
! decodebin ! videoconvert ! videoscale \
! video/x-raw,width=200,height=100 \
! mix.sink_4 \
mix ! queue ! videoconvert ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://streaming.example.com:1935/test'
让我在这里提供一些有关“name=”用法的信息。
您可以在 gstreamer 管道中命名一个元素并使用它来构建管道。它主要用于复杂的管道。让我用一个简单的管道来展示它的用法。
假设以下是所需的管道:
srcelem ! elem1 ! elem2 ! elem3 ! sinkelem
可以写成下面这样。
elem2 name=named_elem \ /* Naming elem2 */
named_elem ! elem3 ! sinkelem \ /* Connecting elem2 to downstream pipeline part. Note that there is no "!" before "named_elem" */
srcelem ! elem1 ! named_elem /* Connecting elem2 to upstream pipeline part. Note that there is no "!" after "named_elem" */
如果你仔细阅读,它会构造与前面提到的相同的管道。