Gstreamer: как связать decodebin с encodebin? (ошибка: не удалось отложить привязку какой-либо панели ...) - PullRequest
0 голосов
/ 18 января 2019

Наивно, я пытаюсь связать decodebin с encodebin:

$ gst-launch-1.0 filesrc location="/tmp/sound.wav" ! decodebin ! encodebin profile="application/ogg:video/x-theora:audio/x-vorbis" ! filesink location="/tmp/sound.ogg"
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
WARNING: from element /GstPipeline:pipeline0/GstDecodeBin:decodebin0: Delayed linking failed.
Additional debug info:
./grammar.y(510): gst_parse_no_more_pads (): /GstPipeline:pipeline0/GstDecodeBin:decodebin0:
failed delayed linking some pad of GstDecodeBin named decodebin0 to some pad of GstEncodeBin named encodebin0
ERROR: from element /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstWavParse:wavparse0: Internal data stream error.
Additional debug info:
gstwavparse.c(2293): gst_wavparse_loop (): /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstWavParse:wavparse0:
streaming stopped, reason not-linked (-1)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

Конечно, чего-то не хватает. Что это?

Обратите внимание, это работает: gst-launch-1.0 filesrc location="/tmp/sound.wav" ! decodebin ! audioconvert ! vorbisenc ! oggmux ! filesink location="/tmp/sound.ogg"

1 Ответ

0 голосов
/ 20 января 2019

gst-launch-1.0 filesrc location="/tmp/sound.wav" ! decodebin ! encodebin profile="application/ogg:video/x-theora:audio/x-vorbis" ! filesink location="/tmp/sound.ogg"

encodebin не имеет шаблонов в своих пэдах, поэтому gst-launch не знает, какой пэд запрашивать (видео или аудио). Вы можете явно запросить один из них, используя:

gst-launch-1.0 filesrc location="/tmp/sound.wav" ! decodebin ! enc.audio_%u encodebin name=enc profile="application/ogg:video/x-theora:audio/x-vorbis" ! filesink location="/tmp/sound.ogg"

Обратите внимание, как мы даем encodebin имя «enc», а затем связываем decodebin с аудиопэдом, поскольку знаем, что это файл только для аудио.

Если бы у нас было и видео, и аудио, вам нужно было бы явно связать видеопэд с декодера с видеопэем кодебин и т. Д. Вы также дадите имя декодеру и свяжете их. Что-то вроде: decodebin name=dec dec.audio_%u ! queue ! enc.audio_%u dec.video_%u ! queue ! enc.video_%u

В качестве последнего предложения рекомендуется иметь очередь после каждого элемента, который может разветвляться на несколько путей, например, декодирования. Это обязательно, если у вас есть более одного выхода, но вам не помешает иметь его, даже если у вас есть только один.

...