如何将多个过滤器添加到现有管道GstElement?

时间:2016-03-04 07:12:48

标签: c gstreamer

如何向现有管道添加过滤器。

目前我正在使用现有的视频文件,然后使用gst_parse_launch

进行处理
gst_parse_launch("-v -m -t filesrc location=./videos/example.webm ! decodebin ! cutter threshold-dB=-39  run-length=400000000 !tee name=t ! queue ! fakesink t. ! queue ! valve name=valve ! audioconvert! audioresample !  audio/x-raw, rate=16000, channels=1  ! multifilesink location=./output/output%02d.pcm next-file=2", NULL);

现在这个工作正常。

我想知道如何一次向现有pipeline

添加多个过滤器

我知道我可以做audioconvert = gst_element_factory_make ("audioconvert", "audioconvert");

之类的事情

但有没有任何方法会直接采用像gst_parse_launch方法那样的多个过滤器?

编辑:目前我得到一个带音频视频源的现有管道,我想要做的就是应用我在此管道上开发的过滤器, 我知道我可以使用st_bin_add_many to add,但这需要我gst_element_factory_make,但我想知道有什么方法可以使用gst_parse_launch处理所有过滤器{{} 1}}然后将此新管道添加到现有音频视频管道

2 个答案:

答案 0 :(得分:1)

您可以使用gst_bin_add_many

语法为:(GST_BIN (existing_pipeline), filter1, filter2, filter3, filter4)

请参阅gst_bin_add_many

的文档

答案 1 :(得分:1)

您可以使用gst_parse_bin_from_description()生成包含管道描述中元素的bin:https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstParse.html#gst-parse-bin-from-description

这为您提供了一个包含您指定的所有元素的bin,然后您可以将它们作为单个元素进行处理,并将它们添加到现有管道中,并链接它们。请注意ghost_unlinked_pa​​ds参数,你可能希望这个为TRUE,除非你自己手动重写它。

另外请记住,向正在运行的管道添加元素需要一些特殊情况,我在不久前写了一篇关于它的文章,以防它对您很重要:https://coaxion.net/blog/2014/01/gstreamer-dynamic-pipelines/

另请注意,您无法将“-m -v -t”传递给gst_parse_launch()。这些是命令行gst-launch-1.0工具的参数,gst_parse_launch()会在最好的情况下忽略它们,或者可能只是失败。

另请注意,通过管道描述创建的管道不一定是可重复使用的(如果涉及SOMETIMES或REQUEST打击垫),那么您就不能进入NULL状态,然后回到PAUSED / PLAYING并假设事情仍然相同。如果你需要这个,你必须自己手动创建元素,然后用gst_bin_add()/ gst_bin_add_many()将它们添加到bin中并自己链接它们。