GStreamer Pipeline с отображением udpsrc и сохранением в файл

Мне трудно понять, как создавать конвейеры gstreamer. Я прочитал много вопросов в google и stackoverflow, которые очень похожи на мои, но большинство из них предполагают, что я знаю, что делаю, что не так.

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

Я отправляю этот конвейер с gst-launch-1.0:

gst-launch-1.0 videotestsrc  ! video/x-raw,width=640,height=480 ! \
    videoconvert ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=5600

и я пытаюсь отобразить и записать конвейер из приложения C, используя gst_parse_launch, используя этот конвейер:

udpsrc port=5600 ! application/x-rtp, clock-rate=90000,payload=96 \
  ! rtph264depay ! video/x-h264 ! queue ! h264parse !
    tee name=qgc
    qgc. ! queue ! decodebin ! glupload ! glcolorconvert ! qmlglsink name=sink
    qgc. ! queue ! mp4mux ! filesink location=bleh.mp4

Этот пайплайн корректно отображает видео, но результирующий файл совершенно пуст на диске.

Поскольку есть много очень похожих вопросов о Gstreamer, я хочу задать несколько вопросов, чтобы не задавать вопросов по этому поводу в будущем.

0 - Правильно ли написан конвейер? на тройник немного странно ссылаться, и я не уверен, правильно ли я их использовал.

1 - как я могу обнаружить, что не так в конвейере? Есть ли какой-нибудь отладчик, который я могу использовать для вставки конвейера, и pipeline compiler скажет мне, все ли так, как должно, или, по крайней мере, есть ли очевидные недостатки в созданном мной конвейере (например, отсутствующие заглушки или несовместимые порты)

2 - как мне исправить этот конвейер, чтобы получать видео (которое воспроизводится правильно) и сохранять его на диск? Я почти уверен, что это что-то простое, но я не понял.

Другие ответы на подобные вопросы в основном сбрасывают конвейер, который работает на компьютере пользователя, но в старой версии gstreamer, которая сегодня больше не работает. Извините за длинный текст, я устал.

Счастливого Рождества.


person Tomaz Canabrava    schedule 10.12.2019    source источник


Ответы (3)


Из документации для mp4mux требуется EOF для правильного завершения файла, вы можете принудительно использовать такой EOF с помощью gst-launch-1.0 -e udpsrc port=5600 ! ...

Вот пример без пайплайна tee/qmlsink:

gst-launch-1.0 -e udpsrc port=5600 ! application/x-rtp, clock-rate=90000,payload=96 \
! rtph264depay ! video/x-h264 ! queue ! h264parse ! queue ! mp4mux ! filesink location=bleh.mp4

Вы также можете принудительно использовать EOF с помощью этого кода в C:

        gst_element_send_event(pipeline, gst_event_new_eos())
person Patrick José Pereira    schedule 10.12.2019

Как видите, нам нужно отправить событие eos здесь: https://github.com/mavlink/qgroundcontrol/blob/master/src/VideoStreaming/VideoReceiver.cc#L822

person Jacob Walser    schedule 11.12.2019
comment
Пожалуйста, напишите, что может помочь ОП и как ваше предложение дает понимание. предоставление ссылок без пояснений не помогает. - person Jawad; 11.12.2019

HOST=192.168.31.175

отправитель:

gst-launch-1.0 -v videotestsrc ! x264enc ! rtph264pay ! udpsink port=5000 host=$HOST

приемник (отображение и запись одновременно):

gst-launch-1.0 -v udpsrc port=5000 ! "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" \
! rtph264depay ! h264parse \
! tee name=t \
t. ! queue ! mp4mux ! filesink location=xyz.mp4 -e \
t. ! queue leaky=1 ! decodebin ! videoconvert ! autovideosink sync=false

Заметки:

  1. filesink location=xyz.mp4 -e из -e (сигнал EOS): конвейеры для сохранения файлов требуют надежного сигнала EOS (конец потока).
  2. queue leaky=1 и sync=false: сделать так, чтобы очередь рендеринга не блокировалась
person liviaerxin    schedule 07.07.2020