当前位置: 代码迷 >> 综合 >> 快速入门:GStreamer 常用元素及其用法
  详细解决方案

快速入门:GStreamer 常用元素及其用法

热度:26   发布时间:2023-12-12 15:39:28.0

0. 目标

本教程提供了一个值得了解的方便的 GStreamer 元素列表。它们的范围从允许您轻松构建复杂管道的强大的一体式元素(如 playbin)到在调试时非常有用的小助手元素。

为了简单起见,下面的例子是使用 gst-launch-1.0 工具给出的(在《基础教程10: GStreamer工具》中了解它)。如果要查看正在协商的焊盘封口,请使用-v命令行参数。

1. Bins

Bin 的英文原意是箱子的意思,在 GStreamer 中表示若干元素的集合。利用多个元素组合在一起,可以完成一件复杂的任务。GStreamer 提供了若干 Bin,用于简化程序设计。

注意,在 GStreamer 体系中,Bin 本身也是元素 (element)。这就很有意思了,这意味着我们可以把一个复杂的 Bin 按照树形结构分解成若干层级。从工程学的角度来看,这是非常有用的。

playbin

playbin 非常有用,可以说 GStreamer 的整部教程都是围绕着与他相关的内容展开,它涵盖了从媒体流的数据源到媒体的显示展现,包括了媒体流格式解析和数据解码。有关详细信息,请参见《播放教程》。

uridecodebin

uridecodebin 可以把媒体流中的数据通过解码运算还原为原始数据。我们知道,一个完整的媒体流管道包括 source、filter 和 sink 三种类型的元素。uridecodebin 可以根据 URI 媒体流的具体格式选择一个合适的 source 元素,并把这个 source 元素连接到一个负责解码的 decodebin 元素。它的行为就像一个多路信号分离器,可以从尽可能多的 source pad 以便从适配媒体流中各种各样的媒体数据。

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

decodebin

该元件通过自动插入,使用可用的解码器和解复用器自动构建解码管道,直到获得原始媒体。它由 uridecodebin 在内部使用,uridecodebin 通常使用起来更方便,因为它还创建了一个合适的源元素。它将替换旧的 decodebin 元素。它的行为就像一个多路信号分离器,所以它提供了尽可能多的source pad 以便匹配媒体流中的媒体数据。

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

2. 文件输入/输出

filesrc

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

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

我的机器上没找到上面的文件,改用下面的命令,正常显示:

gst-launch-1.0 filesrc location=~/demos/videos/B01.avi ! decodebin ! autovideosink

filesink

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

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

3. 网络

souphttpsrc

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

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

4. 生成测试媒体

下面介绍的两个元素很重要,他们可以“可靠”地产生视频信号和音频信号。必要时,我们用他们来替换 pipeline 的媒体信号源,这样可以测试一个 pipeline 的其他部分是否正常工作。

videotestsrc

此元素生成视频模式(可在具有pattern属性的许多不同选项中选择),用它来测试视频 pipeline。

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

audiotestsrc

此元素生成音频波(可在具有wave属性的许多不同选项中选择),用它来测试视频管道。

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

5. 视频适配器

videoconvert

videoconvert 负责把视频信号从一个颜色空间(如RGB)转换为另一个颜色空间(如YUV)。它还可以在不同的YUV格式(例如I420、NV12、YUY2)之间进行转换…) 或RGB格式安排(例如RGBA、ARGB、BGRA…)。

建媒体管道的时,元素或 pad 之间的能力 Caps 匹配过程中,videoconvert 可以减少很多麻烦。如果它的上游和下游元素已经可以相互理解,不需要 videoconvert 做格式转换时,它以传递模式工作,对性能的影响最小。

根据经验,每当使用在设计时其能力 Caps 未知的元素(如 autovideosink)或根据外部因素(如解码用户提供的文件)而变化的元素时,请始终使用 videoconvert

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

videorate

这个元素接收时间戳视频帧的传入流,并生成与 source pad 的帧速率匹配的流。校正是通过删除和复制帧来执行的,没有使用任何花哨的算法来插值帧。

这对于允许需要不同帧速率的元素进行链接非常有用。和其他适配器一样,如果不需要它(因为两个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://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw,width=178,height=100 ! videoconvert ! autovideosink

注意:上述命令行在 Jetson Nano 上是不能运行的,因为分辨率无法协商成功。估计这与 Jetson 对视频显示的底层设计有关 —— GStreamer 这个课程中的所有视频显示,都无法在图形窗口内进行,而是直接显示在全屏模式下,估计数据直接送 GPU 显示存储空间了。

6. 音频适配器

audioconvert

此元素在各种可能的格式之间转换原始音频缓冲区。它支持整数到浮点转换、宽度/深度转换、有符号和端点转换以及通道转换。

就像 videoconvert 对视频所做的那样,您可以使用它来解决与音频的协商问题,并且通常可以自由地使用它,因为如果不需要它,这个元素什么都不做。

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

audiosample

此元素使用可配置的窗口功能将原始音频缓冲区重新采样为不同的采样率,以提高质量。

同样,用它来解决有关抽样率的谈判问题,不要害怕慷慨地使用它。

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

audiorate

这个元素接收一个带有时间戳的原始音频帧的传入流,并通过根据需要插入或删除样本来生成一个完美的流。它不允许像 videorate 那样改变采样率,它只是填补空白并删除重叠的采样,这样输出流是连续的和“干净的”。

在时间戳将丢失的情况下(例如,当存储为某些文件格式时),它很有用,并且接收器将要求所有样本都存在。举例说明这一点很麻烦,因此没有举例说明。

  • 警告大多数时候,audiorate 不是你想要的。

7. 多线程

queue

《基本教程7:多线程和Pad可用性》中已经解释了队列。基本上,队列执行两个任务:

  • 数据排队,直到达到选定的限制。任何将更多缓冲区推入队列的尝试都会阻塞推送线程,直到有更多的空间可用。
  • 该队列在源Pad上创建一个新线程,以解耦接收器和源Pad上的处理。

此外,当队列即将变空或变满时(根据一些可配置的阈值),queue 会触发信号,当队列满时,队列会被指示丢弃缓冲区而不是阻塞。

根据经验,只要您不关心网络缓冲,就应该选择更简单的 queue 元素而不是 queue2。有关示例,请参见 《基本教程7:多线程和Pad可用性》。

queue2

此元素不是队列的演化。它具有相同的设计目标,但遵循不同的实现方法,从而产生不同的特性。不幸的是,通常很难判断哪个队列是最佳选择。

queue2queue 执行上面列出的两个任务,此外,还能够将接收到的数据(或其中的一部分)存储在磁盘文件中,以供以后检索。它还用《基础教程12:流媒体》中描述的更通用、更方便的缓冲消息替换信号。

根据经验,只要您关心网络缓冲,就应该选择 queue2 而不是 queue。有关示例,请参见基本教程12:流媒体(queue2 隐藏在 playbin 中)。

multiqueue

此元素同时为多个流提供队列,并通过允许某些队列在其他流上没有接收到数据时增长,或允许某些队列在未连接到任何对象时丢弃数据(而不是像更简单的队列那样返回错误)来简化对它们的管理。此外,它还同步不同的流,确保它们中的任何一个都不会比其他流走得太远。

这是一个高级元素。它可以在 decodebin 中找到,但是您很少需要在普通的回放应用程序中自己实例化它。

tee

《基础教程7:多线程和 Pad 可用性》已经演示了如何使用 tee 元素,它将数据拆分为多个 pad。例如,当捕获视频时,分割数据流是有用的,其中视频显示在屏幕上,并且还编码并写入文件。另一个例子是播放音乐和连接可视化模块。

需要在每个分支中使用单独的队列元素为每个分支提供单独的线程。否则,一个分支中被阻塞的数据流将使其他分支暂停。

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

8. 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 函数。一旦检测到该类型,它就会将其源焊盘帽设置为找到的介质类型,并发出 have type 信号。

它在内部由 decodebin 实例化,您也可以使用它来查找媒体类型,尽管您通常可以使用 GstDiscoverer 来提供更多信息(如《基础教程9:媒体信息收集》中所示)。

9. 调试

fakesink

这个 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

10. 结论

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

  相关解决方案