据我了解,gst_parse_launch()基于描述管道的命令行语法创建了一个新管道。它会自动处理请求垫(有时是垫等)的所有复杂细节,并构建管道。
所以我的问题是,为什么不一直使用它呢?为什么还要添加垫添加处理程序、请求和链接垫等?
有没有使用gst_parse_launch()的情况?
许多 GStreamer 元素将使用这些特性来探测它们应该加载的插件。想到的最好的例子是decodebin或playbin插件。对于第一个,您只需选择源(例如filesrc)。
现在,播放我们的媒体流时会发生什么?
一开始,decodebin的“内部”只有:
--- 接收器 -->|[ 类型查找] |
此时没有源垫出现,因为该元素仍然不知道流内容。
如果您有avi视频文件,那么decodebin将首先使用特定的 GStreamer 元素来探测流中使用的容器/编解码器是什么。此元素 ( GstTypeFind ) 将根据流和编解码器/容器之间的相似性计算分数。
在这个例子中,TypeFind 将命中avi容器,因此它会分配一个avi解析器。decodebin的“内部”现在正在扩展...... avi解析器分析流以了解是否有音频/视频子流需要解析。如果是这样,则 typefind 再次进入以查找使用的编解码器。
然后分配适当的解码器。在这里,decodebin现在已经完全准备好了,下游元素(如 sink 元素)必须链接到新创建的 source pad 以使流继续运行。这是通过焊盘添加信号和焊盘链接程序完成的。
如果没有任何这些焊盘功能,则无法实现此行为,并且必须在金属中静态设置所有内容,然后才能获取流。这意味着您必须提前知道您将要阅读的流的内容是什么(这是一个非常非常严格的限制!)
最后一点:当您通过命令行指定管道时(就像gst-launch
我猜的那样),您处于高级界面。在您指定的元素中,焊盘链接机制可能非常重要!事情是你不必费心,因为事情会完成。但是“不必为某事烦恼”并不意味着这件事对你没用。
如果使用 gst-launch,则只能运行静态管道。也就是说,您无法搜索,无法随时间改变音量,无法播放第二个文件。
gst-launch 实际上是作为一个开发者工具来尝试一个元素或一些属性。