是否有可能从垫上添加回调的外部链接?

时间:2014-08-27 10:22:49

标签: c++ gstreamer

与主题相同的问题,是否可以将有时填充从例如decodebin元素链接到其他兼容元素的pad?

我正在尝试做这样的事情:

GstElement *decodebin = gst_element_factory_make( "decodebin", nullptr );
GstPad *pad = gst_pad_new( nullptr, GST_PAD_SRC );
gst_element_add_pad( decodebin, pad );
gst_bin_add( GST_BIN(pipeline), decodebin );

GstElement *videoconvert = gst_element_factory_make( "videoconvert", nullptr );
gst_bin_add( GST_BIN(pipeline), videoconvert );

gst_element_link( decodebin, videoconvert );

奇怪的是gst_element_link调用是成功的,因此我认为元素链接得很好。但是,当尝试运行管道时,我从h264parse元素(它位于我认为的decodebin中)得到一般流错误,原因:没有链接。 我已经设法通过从on-pad-added回调中链接这些pad来使管道工作,但是为每个元素创建一个新的回调函数似乎并不方便,有时我需要使用它们。

1 个答案:

答案 0 :(得分:2)

将会发生新添加的decodebin pad与视频会话链接。然而,这个pad不知道decodebin并且不会提供任何数据,而decodebin将自己添加的pad将产生数据,但不会链接到任何东西(从而导致无链接错误)。

你可以在pad-added回调之外链接到有时打击垫,但在常见情况下你需要在pad-added回调中阻止打击垫以防止它输出会导致无链接错误的数据。然后你可以链接到有时填充并解锁它。请参阅gst_pad_add_probe()(在1.x中,在0.10中是gst_pad_set_blocked *())。

或者你可以使用gst_parse_launch()或gst_parse_bin_from_description()和#34; decodebin! videoconvert",它将自动从添加了焊盘的信号中进行延迟链接。