GStreamer——教程——基础教程14:Handy elements

基础教程14:有用的元素

目标

本教程提供了一些值得了解的GStreamer元素列表。它们从功能强大的一体式元素(如playbin)到在调试时非常有用的小的帮助元素不等,可以帮助您轻松构建复杂的管道。
为了简单起见,以下示例使用gst-launch-1.0工具(了解它在 基本教程10:GStreamer工具)。如果您想查看正在协商的Pad Caps,请使用-v命令行参数。

Bins

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

playbin

这个元素在整个教程中被广泛使用。它管理媒体播放的所有方面,从源到显示,经过解复用和解码。它非常灵活,有许多选项,因此有一整套教程专门介绍它。有关更多详细信息,请参阅播放教程

uridecodebin

此元素将从URI解码数据为原始媒体。它选择一个可以处理给定URI方案的源元素,并将其连接到解码bin元素上。它类似于一个解复用器,因此提供与媒体中找到的流一样多的源pad。

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

decodebin

该元素通过自动插入可用的解码器和解复用器,自动构建一个解码管道,直到获得原始媒体。它由uridecodebin内部使用,通常更方便使用,因为它还创建了一个合适的源元素。它取代了旧的解码bin元素。它像一个解复用器一样工作,因此提供与媒体中找到的流一样多的源pad。

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

文件输入/输出

filesrc

这个元素读取本地文件并生成带有任意Caps的媒体。如果您想获取媒体的正确Caps,请使用typefind元素或通过将filesrc的类型查找属性设置为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库作为客户端通过网络接收数据。通过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…)。
通常在解决协商问题时,这是您的首选。当不需要时(因为其上游和下游元素已经可以理解彼此),它会以最小影响性能的通过模式运行。
经验法则是,每当使用像autovideosink这样Caps在设计时未知的元素,或者像解码用户提供的文件那样可能因外部因素而变化的元素时,始终使用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

此元素调整视频帧的大小。默认情况下,该元素尝试在源和接收器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可用性中解释过。基本上,队列执行两个任务:

  • 数据被排队,直到达到选定的限制。任何尝试将更多缓冲区推入队列的操作都会阻塞推送线程,直到有更多空间可用。
  • 队列在源Pad上创建一个新的线程,以分离处理sink和source Pads。

此外,当队列即将变空或满时(根据某些可配置的阈值),队列会触发信号,并且可以在队列满时指示丢弃缓冲区而不是阻塞。
一般来说,如果网络缓冲不需要考虑,那么建议使用更简单的queue元素。有关示例,请参见基本教程7:多线程和Pad可用性 举个例子。

queue2

这不是queue的进化版本。它的设计目标相同,但采用了不同的实现方法,从而产生了不同的功能。不幸的是,通常不容易判断哪个队列是最好的选择。
queue2执行上面列出的queue的两个任务,此外,它还能够在磁盘文件上存储接收到的数据(或部分数据),以便以后检索。它还用更通用和方便的缓冲消息替换了基础教程12:流式传输中描述的信号。
一般来说,如果网络缓冲是一个问题,那么建议使用queue2。有关示例(queue2隐藏在playbin中),请参见基本教程12:流式传输 。

multiqueue

此元素为多个流同时提供队列,并通过允许一些队列在没有其他数据流接收数据时增长,或者允许一些队列丢弃未连接到任何东西的数据(而不是像更简单的队列那样返回错误)来简化它们的管理。此外,它同步不同的流,确保没有一个流比其他流走得太远。
这是一个高级元素。它在decodebin中找到,但在正常的播放应用程序中很少需要自己实例化它。

tee

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

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

Capabilities

capsfilter

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

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

typefind

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

调试

fakesink

此接收器简单地吞噬任何提供给它的数据。它在调试时很有用,可以替换您的正常接收器并将它们排除在外。当与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的日常工作中很有用性。有些对生产管道很有价值,而另一些只需要用于调试目的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值