跳转至

便捷的元素

目标

本教程提供了值得了解的便捷 GStreamer 元素列表。它们的范围从强大的 all-in-one 元素(允许您轻松构建复杂的管道)(如 playbin)到在调试时非常有用的小 helper 元素。

为简单起见,使用 gst-launch-1.0 工具给出了以下示例(在基础教程 10:GStreamer 工具中了解它)。如果要查看正在协商的 Pad Cap,请使用 -v 命令行参数。

Bins

这些是 Bin 元素,你将其视为单个元素,它们负责实例化所有必要的内部管道以完成其任务。

playbin

此元素已在整个教程中广泛使用。它管理媒体播放的所有方面,从源到显示,再到解复用和解码。它非常灵活并且有如此多的选项,以至于有一整套教程专门介绍它。有关更多详细信息,请参阅 Playback 教程。

uridecodebin

此元素将 URI 中的数据解码为原始媒体。它选择可以处理给定 URI 方案的源元素,并将其连接到 decodebin 元素。它的作用类似于 demuxer,因此它提供的源焊盘与媒体中的流一样多。

gst-launch-1.0 uridecodebin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! videoconvert ! autovideosink

decodebin

此元素通过自动插入使用可用的解码器和解复用器自动构建解码管道,直到获得原始媒体。它由 uridecodebin 在内部使用,这通常更方便使用,因为它也会创建一个合适的源元素。它替换了旧的 decodebin 元素。它的作用类似于 demuxer,因此它提供的源焊盘与媒体中的流一样多。

gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink

文件输入/输出

filesrc

此元素读取本地文件并生成具有 ANY Cap 的媒体。如果要为媒体获取正确的 Cap,请使用 typefind 元素或将 filesrc 的 typefind 属性设置为 TRUE 来浏览流。

gst-launch-1.0 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin ! autovideosink

filesink

此元素将它接收的所有媒体写入文件。使用 location 属性指定文件名。

gst-launch-1.0 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg

网络

souphttpsrc

此元素使用 libsoup 库通过 HTTP 通过网络作为客户端接收数据。设置要通过 location 属性检索的 URL。

gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink

测试媒体生成

这些元素对于检查管道的其他部分是否正常工作非常有用,方法是将源替换为这些“保证”正常工作的测试源之一。

videotestsrc

此元素生成视频模式(可通过 pattern 属性在许多不同的选项中进行选择)。使用它来测试视频管道。

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

audiotestsrc

此元素产生音频波形(可通过 wave 属性在许多不同的选项中进行选择)。使用它来测试音频管道。

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

视频适配器

videoconvert

此元素从一个色彩空间(例如 RGB)转换为另一个色彩空间(例如 YUV)。它还可以在不同的 YUV 格式(例如 I420、NV12、YUY2 等)或 RGB 格式排列(例如 RGBA、ARGB、BGRA 等)之间进行转换。 这通常是您解决谈判问题时的首选。当不需要时,由于其上游和下游元素已经可以相互理解,因此它以直通模式运行,对性能的影响最小。 根据经验,只要您在设计时使用 Cap 未知的元素(如 autovideosink),或者可能因外部因素而变化的元素(如解码用户提供的文件),请始终使用 videoconvert。

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

videorate

此元素采用带时间戳的视频帧的传入流,并生成与源板的帧速率匹配的流。校正是通过删除和复制帧来执行的,没有使用花哨的算法来插值帧。 这对于允许需要不同帧速率的元素进行链接非常有用。与其他适配器一样,如果不需要它(因为两个 Pad 都可以同意帧速率),它将在直通模式下运行,不会影响性能。 因此,在设计时实际帧速率未知时,最好始终使用它,以防万一。

gst-launch-1.0 videotestsrc ! video/x-raw,framerate=30/1 ! videorate ! video/x-raw,framerate=1/1 ! videoconvert ! autovideosink

videoscale

此元素调整视频帧的大小。默认情况下,该元素会尝试在 source 和 sink pad 上协商到相同的大小,因此不需要缩放。因此,如果不需要缩放,则可以安全地将此元素插入管道中,以获得更健壮的行为,而无需任何成本。 此元素支持各种颜色空间,包括各种 YUV 和 RGB 格式,因此通常能够在管道中的任何位置运行。 如果要将视频输出到大小由用户控制的窗口,最好使用 videoscale 元素,因为并非所有视频接收器都能够执行缩放作。

gst-launch-1.0 uridecodebin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw,width=178,height=100 ! videoconvert ! autovideosink

音频适配器

audioconvert

此元素在各种可能的格式之间转换原始音频缓冲区。它支持整数到浮点数的转换、宽度/深度转换、有符号和字节序转换以及通道转换。 就像 videoconvert 对视频所做的那样,您可以使用它来解决音频的协商问题,并且通常可以安全地自由使用它,因为如果不需要,此元素不会执行任何作。

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

audioresample

此元素使用可配置的窗口函数将原始音频缓冲区重新采样为不同的采样率,以提高质量。 同样,使用它来解决有关采样率的谈判问题,并且不要害怕慷慨地使用它。

gst-launch-1.0 uridecodebin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! audioresample ! audio/x-raw,rate=4000 ! audioconvert ! autoaudiosink

audiorate

此元素采用带有时间戳的原始音频帧的传入流,并根据需要通过插入或删除样本来生成完美的流。它不允许像 videorate 那样更改采样率,它只是填充空白并删除重叠的样本,因此输出流是连续的和“干净的”。 在时间戳将丢失的情况下(例如,当存储为某些文件格式时)并且接收器要求所有样本都存在时,它非常有用。举例说明很麻烦,因此不给出示例。

大多数时候,audiorate 不是您想要的。

多线程

queue

基本教程 7:多线程和 Pad 可用性 中已经解释了队列。基本上,队列执行两项任务: - 数据将排队,直到达到所选限制。任何将更多缓冲区推送到队列中的尝试都会阻止推送线程,直到有更多空间可用。 - 队列在 source Pad 上创建一个新线程,以解耦 sink 和 source pad 上的处理。

此外,队列在即将变空或变满时触发信号(根据一些可配置的阈值),并且可以指示在队列满时丢弃缓冲区而不是阻塞。 根据经验,只要您不关心网络缓冲,就首选更简单的 queue 元素而不是 queue2。有关示例,请参阅 Basic tutorial 7: Multithreading and Pad Availability 。

queue2

此元素不是 queue 的演变。它具有相同的设计目标,但遵循不同的实现方法,这会产生不同的功能。不幸的是,通常不容易判断哪个队列是最佳选择。 queue2 为 queue 执行上面列出的两项任务,此外,它还能够将接收到的数据(或部分数据)存储在磁盘文件中,以供以后检索。它还将信号替换为 基础教程 12:流 中描述的更通用、更方便的缓冲消息。 根据经验,当您担心网络缓冲时,首选 queue2 而不是 queue。有关示例,请参阅基本教程 12:流式处理(queue2 隐藏在 playbin 中)。

multiqueue

此元素同时为多个流提供队列,并简化其管理,方法是:如果其他流上没有收到数据,则允许某些队列增长,或者允许某些队列在未连接到任何事物时丢弃数据(而不是像更简单的队列那样返回错误)。此外,它还会同步不同的流,确保它们都不会比其他流领先太多。 这是一个高级元素。它位于 decodebin 中,但您很少需要在普通播放应用程序中自行实例化它。

tee

基本教程 7:多线程和 Pad 可用性 已经展示了如何使用 tee 元素,它将数据拆分为多个 pad。拆分数据流非常有用,例如,在捕获视频时,视频显示在屏幕上,并且还对其进行编码并写入文件。另一个示例是播放音乐并连接可视化模块。 需要在每个分支中使用单独的 queue 元素,以便为每个分支提供单独的线程。否则,一个分支中阻塞的数据流将导致其他分支停滞。

gst-launch-1.0 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! videoconvert ! autovideosink

能力

capsfilter

基本教程 10:GStreamer 工具已经解释了如何在 gst-launch-1.0 中使用 Caps 过滤器。以编程方式构建管道时,Caps 过滤器是使用 capsfilter 元素实现的。此元素不会修改数据本身,但会对数据格式施加限制。

gst-launch-1.0 videotestsrc ! video/x-raw, format=GRAY8 ! videoconvert ! autovideosink

typefind

此元素确定流包含的媒体类型。它按其等级顺序应用找版函数。一旦检测到该类型,它就会将其源 Pad Caps 设置为找到的媒体类型,并发出 have-type 信号。 它由 decodebin 在内部实例化,您也可以使用它来查找媒体类型,尽管您通常可以使用 GstDiscoverer 来提供更多信息(如基本教程 9:媒体信息收集中所示)。

调试

fakesink

这个 sink 元素只是吞噬提供给它的任何数据。在调试时,替换普通的 sink 并将其排除在等式之外是很有用的。当与 gst-launch-1.0 的 -v 开关结合使用时,它可能非常冗长,因此请使用 silent 属性来消除任何不需要的噪音。

gst-launch-1.0 audiotestsrc num-buffers=1000 ! fakesink sync=false

identity

这是一个虚拟元素,它通过未修改的方式传递传入数据。它具有几个有用的诊断功能,例如偏移量和时间戳检查或缓冲区丢弃。阅读其文档,了解这个看似无害的元素可以做的所有事情。

gst-launch-1.0 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink

总结

本教程列出了一些值得了解的元素,因为它们在 GStreamer 的日常工作中很有用。有些管道对于生产管道很有价值,而另一些则仅用于调试目的。

很高兴您来到这里,很快再见!

评论