Получение потоков RTMP в GStreamer, создание мозаики и отправка полученного RTMP - PullRequest
0 голосов
/ 26 сентября 2018

Я запускаю следующий код

     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 \
    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'

Спасибо.Мы решили проблему с мозаикой.Это рабочая версия.

1 Ответ

0 голосов
/ 27 сентября 2018

Есть две проблемы.

1) Основная проблема заключается в том, что "videomixer" имеет только одну панель управления src.Вы подключаете его к двум колодкам.-

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 

При этом вы подключаете видеомиксер src_pad к приемной площадке Sixvimagesink

И снова в конце вы пытаетесь подключить видеомиксер src_ к rtmpsink, используя очередь и другие элементы.

Так что вам нужно удалить одно из соединений.

Если вы не хотите подключаться к xvimagesink, просто удалите "! Xvimagesink"

Если вы не хотитеподключитесь к rtmpsink, удалите часть «mix! queue! videoconvert ...».

2) Если вы хотите сохранить подключение к очереди, возникает следующая проблема.Вы подключаете mix.sink_4 к mix.src.

... ! mix.sink_4 \
        ! mix. ! queue ! videoconvert ! ...

Удалите первое "!"а также "."в последней строке.

... ! mix.sink_4 \
         mix ! queue ! videoconvert ! ...

Тогда это не должно давать синтаксическую ошибку.

РЕДАКТИРОВАТЬ 1

Я думаю, вы снова допустили ошибку.Вы подключаете src mix к 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" */

Есливы читаете его внимательно, он создает тот же конвейер, который упоминался ранее.

...