Gstreamer videomixer - продолжайте работать, когда один источник не работает - PullRequest
0 голосов
/ 12 октября 2018

У меня есть конвейер, который использует видеомиксер для отображения 10 видеопотоков rtp / h264 в двух рядах (пока что), который работает в основном так, как задумано.

Проблема в том, что один из потоков в настоящее время отсутствуетработает, или, что еще хуже, уходит (изменение файлов, проблемы с сетью и т. д.), затем видеомиксер аварийно завершает работу и конвейер останавливается или не выполняет предварительную подготовку вообще.

используемая мной команда запуска:

    /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_4::alpha=1.0 \
    sink_4::ypos=80 \
    sink_4::xpos=1140 \
    sink_5::alpha=1.0 \
    sink_5::ypos=80 \
    sink_5::xpos=1550 \
    sink_6::alpha=1.0 \
    sink_6::ypos=500 \
    sink_6::xpos=40 \
    sink_7::alpha=1.0 \
    sink_7::ypos=500 \
    sink_7::xpos=410 \
    sink_8::alpha=1.0 \
    sink_8::ypos=500 \
    sink_8::xpos=780 \
    sink_9::alpha=1.0 \
    sink_9::ypos=500 \
    sink_9::xpos=1140 \
    sink_10::alpha=1.0 \
    sink_10::ypos=500 \
    sink_10::xpos=1550 \
    sink_11::alpha=0.4 \
    sink_11::ypos=935 \
    sink_11::xpos=1440 \
    sink_0::zorder=1 \
    sink_1::zorder=3 \
    sink_2::zorder=3 \
    sink_3::zorder=4 \
    sink_4::zorder=5 \
    sink_5::zorder=6 \
    sink_6::zorder=7 \
    sink_7::zorder=8 \
    sink_8::zorder=9 \
    sink_9::zorder=10 \
    sink_10::zorder=11 \
    sink_11::zorder=12 \
    ! 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 \
    udpsrc multicast-group=239.255.42.46 address=239.255.42.46 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_4 \
   udpsrc multicast-group=239.255.42.59 address=239.255.42.59 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_5 \
    udpsrc multicast-group=239.255.42.56 address=239.255.42.56 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_6 \
    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_7 \
    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_8 \
    udpsrc multicast-group=239.255.42.46 address=239.255.42.46 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_9 \
   udpsrc multicast-group=239.255.42.59 address=239.255.42.59 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_10 \
    videotestsrc pattern="snow" \
            ! video/x-raw, framerate=1/1, width=464, height=120 \
            ! mix.sink_11 \

Мой вопрос, возможно ли, чтобы udpsrc или видеомиксер игнорировали, когда поток недоступен, чтобы он продолжал показывать и смешивать остальные?

Я добрыйиз застрявших на данный момент, я попробовал несколько различных способов реализовать экран монтажа для мониторинга наших потоков (включая скрипт pygtk libvlc, который тоже работает, но имеет другие проблемы).Это видеомикс и ретрансляция с использованием gstreamer великолепны, потому что а) именно так мы делаем большинство других потоков в доме, и б) я могу легко просматривать весь монтаж на наших приемниках.

Я экспериментировал с использованиемGstreamer API от c.до сих пор мне удалось получить тот же монтаж с помощью команды gst_parse_launch (), но это не полный метод создания элементов, добавления их в корзину и связывания их (понятия, с которыми я новичок в той степени, в которойкод c идет).Версия gst_parse_launch () имеет ту же проблему остановки при сбое любого из источников.

Я пытался задавать вопросы в IRC-сети разработчиков, но, похоже, никогда не обращал на них внимания :(

Есть идеи?

...