1 实用元素
引言:本章对前面出现的所有常用元素做了一个总结。介绍了常用元素的功能/用法等,在实际的项目开发中经常用到这些元素。
1.1 Bins
这些是Bin
元素,您将它们视为单个元素,它们负责实例化所有必要的内部流水线以完成其任务。
playbin
这个元素在整个教程中被广泛使用。它管理媒体播放的所有方面,从源到显示,通过解复用和解码。它非常灵活,有很多选项,因此有一套教程专门介绍它。请参阅Playback tutorials了解更多详细信息。uridecodebin
此元素将URI
中的数据解码为原始媒体。它选择一个能够处理给定URI
方案的源元素,并将其连接到decodebin
元素。它的作用类似于解复用器(demuxer
),因此它提供与媒体中发现的流数量相同的source pads
。decodebin
此元素通过自动插件(auto-plugging
)使用可用的解码器和解复用器自动构建解码流水线,直到获取到原始媒体。它在uridecodebin
中内部使用,使用起来通常更方便,因为它还会创建一个合适的源元素。它替代了旧的decodebin
元素。它的作用类似于解复用器(demuxer
),因此它提供与媒体中发现的流数量相同的source pads
。
1.2 File input/output
filesrc
该元素用于读取本地文件并生成任意Caps
的媒体。如果您想获得媒体的正确Caps
,请使用typefind
元素来探测流,或者将filesrc
的typefind
属性设置为TRUE
。filesink
该元素将接收到的所有媒体写入文件。使用location
属性来指定文件名。
1.3 Network
souphttpsrc
该元素使用libsoup
库通过HTTP
作为客户端从网络接收数据。通过location
属性设置要检索的URL
。
1.4 Test media generation
这些元素非常有用,可以通过将源替换为其中一个“保证”工作的测试源,来检查流水线的其他部分是否正常工作。
videotestsrc
该元素生成一个视频模式(可以通过pattern
属性在多个不同选项中选择)。使用它来测试视频流水线。audiotestsrc
该元素生成一个音频波形(可以通过wave
属性在多个不同选项中选择)。使用它来测试音频流水线。
1.5 Video adapters
-
videoconvert
该元素用于在不同的颜色空间之间进行转换(例如RGB到YUV)。它还可以在不同的YUV格式(例如I420、NV12、YUY2等)或RGB格式排列(例如RGBA、ARGB、BGRA等)之间进行转换。这通常是解决协商(
negotiation
)问题时的首选元素。当上游和下游元素已经可以相互理解时,它以pass-through
模式运行,对性能影响最小。一般而言,无论是在设计阶段使用元素的Caps未知(如
autovideosink
),还是在读取用户提供的文件时,使用videoconvert
是一个明智的选择。 -
videorate
该元素接收带有时间戳的视频帧流,并生成与源pad的帧速率匹配的流。校正是通过丢弃和复制帧来进行的,没有使用复杂的插值算法。这对于允许需要不同帧速率的元素进行连接非常有用。与其他适配器一样,如果不需要(因为有一个帧速率可以让两个
Pad
达成一致),它将以pass-through
模式运行,不会影响性能。因此,在设计时,如果实际帧速率在设计时未知,始终使用
videorate
是一个明智的选择,以防万一。 -
videoscale
该元素用于调整视频帧的大小。默认情况下,该元素试图在source and sink Pads
上进行协商(negotiation
),以便不需要进行缩放。因此,如果不需要进行缩放,可以将该元素插入到流水线中,以获得更加稳健的行为而不产生任何成本。该元素支持广泛的颜色空间,包括各种YUV和RGB格式,因此通常能够在流水线的任何位置使用。
如果视频要输出到用户控制大小的窗口中,建议使用
videoscale
元素,因为并非所有视频输出设备都能够执行缩放操作。 -
audioconvert
该元素用于在各种可能的格式之间转换原始音频缓冲区。它支持整数到浮点数的转换、宽度/深度转换、有符号和无符号转换、字节序转换以及通道转换。与
videoconvert
对于视频一样,您可以使用audioconvert
来解决音频的协商问题,并且通常可以自由使用它,因为如果不需要转换,该元素将不起任何作用。 -
audioresample
该元素使用可配置的窗口函数将原始音频缓冲区重新采样为不同的采样率,以提高质量。同样,使用它来解决有关采样率的协商问题,并且不要担心大量使用它。
-
audiorate
该元素接收带有时间戳的原始音频帧流,并根据需要插入或丢弃样本,以生成完美的音频流。它不像videorate
那样允许更改采样率,它只是填充空白和移除重叠的样本,使输出流连续且“干净”。当时间戳将要丢失(例如在存储到某些文件格式时)并且接收器需要所有样本时,它非常有用。这很难举例说明,因此没有给出示例。
警告:大多数情况下,
audiorate
不是您想要的。\
1.6 多线程
-
queue
队列在《Basic tutorial 7: Multithreading and Pad Availability》中已经解释过。基本上,队列执行两个任务:- 将数据排队,直到达到选定的限制。任何将更多的缓冲区推入队列中的尝试都会阻塞推送线程,直到有更多的空间可用。
- 队列在
source Pad
上创建一个新线程,以解耦source pads
和sink Pads
上的处理过程。
此外,队列在即将变为空或变为满时(根据一些可配置的阈值),会触发信号,并且可以在队列满时,指示删除缓冲区而不是阻塞。
一般而言,在不考虑网络缓冲的情况下,更倾向于使用更简单的
queue
而不是queue2
。 -
queue2
该元素不是queue
的进化版本。它们二者具有相同的设计目标,但采用了不同的实现方法,因此具有不同的特性。不幸的是,通常很难判断哪个队列是最佳选择。queue2
执行了queue
列出的两个任务,并且还能够将接收到的数据(或其中的一部分)存储在磁盘文件中,以供以后检索。它还用《Basic tutorial 12: Streaming》中描述的更通用和便捷的缓冲消息替换了信号。一般而言,在考虑网络缓冲时,更倾向于使用
queue2
而不是queue
。(queue2
隐藏在playbin
中)。 -
multiqueue
该元素可同时为多个流提供队列,并通过允许一些队列在其他流未接收到数据时扩张,或者允许一些队列在未连接到任何东西时丢弃数据(而不是像简单queue
那样返回错误),从而简化其管理。此外,它还同步不同的流,确保它们中的任何一个都不会超过其他流太多。这是一个高级元素。它可以在
decodebin
中找到,但在正常的播放应用程序中,您很少需要自己实例化它。 -
tee
《Basic tutorial 7: Multithreading and Pad Availability》已经展示了如何使用tee
元素将数据分流到多个Pads
。在捕获视频并在屏幕上显示视频以及对其进行编码和写入文件时,分流数据流非常有用。另一个例子是播放音乐并连接可视化模块。需要在每个分支中使用单独的队列元素,以为每个分支提供单独的线程。否则,一个分支中的阻塞数据流将导致其他分支停顿。
1.7 Capabilities
-
capsfilter
《Basic tutorial 10: GStreamer tools》已经解释了如何在gst-launch-1.0
中使用Caps过滤器。在以编程方式构建流水线时,使用capsfilter
元素来实现Caps过滤器。该元素本身不会修改数据,而是对数据格式施加限制。 -
typefind
该元素用于确定流所包含的媒体类型。它按照排名顺序应用typefind
函数。一旦检测到类型,它将其source Pad
的Caps
设置为找到的媒体类型,并发出`have-type信号。它在
decodebin
内部实例化,您也可以使用它来查找媒体类型,通常也可以使用GstDiscoverer
获得更多信息(如《Basic tutorial 9: Media information gathering》中所示)。
1.8 Debugging
fakesink
这个sink
元素只会吞掉传入的任何数据。在调试时,它非常有用,可以替换普通的sink
元素,并将其排除在解决方案之外。当与gst-launch-1.0
的-v
开关组合使用时,它可能非常冗长,因此可以使用silent
属性来消除任何不必要的噪音。identity
这是一个虚拟元素,可以直接将传入的数据不做任何修改地通过。它具有多种有用的诊断功能,例如偏移和时间戳检查,或者缓冲区丢弃。阅读其文档以了解这个看似无害的元素能够做的所有事情。