GStreamer Tutorial 14中文翻译
文章目录
- GStreamer Tutorial 14中文翻译
- 前言
- [Basic tutorial 14: Handy elements](https://gstreamer.freedesktop.org/documentation/tutorials/basic/handy-elements.html?gi-language=c)
前言
由于工作原因,用的GStreamer的图像解码库,所以记录GStreamer Tutorial 的中文翻译和个人的理解以便学习。若有不足请多指教。侵删。
Basic tutorial 14: Handy elements
目的
本教程列出了一些有用的、值得了解的GStreamer元素。它们的范围从允许您轻松构建复杂管道的强大的一体化元素(如playbin),到调试时非常有用的小助手元素。
为简单起见,下面给出了使用gst-launch-1.0工具的示例(在基础教程10:GStreamer工具中了解它)。如果您想要查看正在协商的Pad Caps,请使用-v命令行参数。
Bins
这些是Bin元素,你把它们当作一个单独的元素,它们负责实例化所有必要的内部pipeline来完成它们的任务。
playbin
这个元素在整个教程中被广泛使用。它管理媒体播放的所有方面,从源头到显示,经过解复用和解码。它是如此灵活,有如此多的选项,以至于有一整组教程专门讨论它。更多细节请参见播放教程。
uridecodebin
这个元素把URI的数据解码成原始媒体。它选择一个可以处理给定URI方案的源元素,并将其连接到一个解码器元素。它的作用就像一个解复用器,所以它提供了与媒体中发现的流一样多的source pad
。
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! videoconvert ! autovideosink
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink
decodebin
这个元素通过自动插入,使用可用的解码器和解复用器自动构建一个解码管道,直到获得原始媒体。它在内部被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
File input/output
filesrc
这个元素读取一个本地文件,并产生具有ANY
的Caps的媒体。如果你想为媒体获得正确的Caps,通过使用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
Network
souphttpsrc
这个元素作为客户端通过网络使用libsoup库接收数据。通过location属性设置要检索的URL。
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink
测试媒体的生成
这些元素对于检查pipeline的其他部分是否工作是非常有用的,通过用这些 "保证 "工作的测试源之一来替换该源。
videotestsrc
这个元素产生一个视频模式(可通过模式属性在许多不同的选项中选择)。用它来测试视频管道。
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…)之间转换。
这通常是你在解决一致问题(negotiation problems)时的首选。当不需要时,由于其上游和下游的元素已经可以相互理解,它以直通模式行事,对性能影响最小。
作为一条经验法则,当你使用那些在设计时Caps
未知的元素时,总是使用videoconvert
,比如autovideosink
,或者可以根据外部因素变化,比如解码一个用户提供的文件。
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
videorate
这个元素接收一个带时间戳的视频帧流,并产生一个与source pad
的帧率相匹配的流。纠正是通过丢弃和复制帧来进行的,没有使用花哨的算法来插值帧。
这对于允许需要不同帧速率的元素链接是很有用的。与其他适配器一样,如果不需要它(因为有一个两个Pads都同意的帧速率),它将以直通模式工作,不会影响性能。
因此,当设计时实际帧率未知时,最好总是使用它,以防万一。
gst-launch-1.0 videotestsrc ! video/x-raw,framerate=30/1 ! videorate ! video/x-raw,framerate=1/1 ! videoconvert ! autovideosink
音频适配器
audioconcvert
这个元素在各种可能的格式之间转换原始音频缓冲区。它支持整数到浮点数的转换、宽度/深度转换、有符号性和无符号性的转换以及通道转换。
就像videoconvert对视频所做的那样,你用它来解决与音频的协商问题,一般来说,随意使用它是安全的,因为如果不需要这个元素,它就什么也不做。
gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink
audioresample
该元素使用可配置的窗口功能将原始音频缓冲区重新采样到不同的采样率,以提高质量。
同样,用它来解决有关采样率的一致问题,不要害怕使用它。
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
不是你想要的。
多线程
queue
队列已经在基础教程7:多线程和pad可用性中作了解释。基本上,一个队列执行两个任务:
- 数据被排在队列中,直到达到一个选定的限制。任何将更多的缓冲区推入队列的尝试都会阻止推入线程,直到有更多的空间可用;
- 该队列在
source pad
上创建一个新的线程,以解耦source pad
和sink
上的处理。
此外,队列在即将变空或变满时(根据一些可配置的阈值)会触发信号,并且可以被指示丢弃缓冲区,而不是在满时阻塞。
作为一条经验法则,只要网络缓冲不是你关心的问题,就应该选择更简单的队列元素而不是queue2。请看基础教程7:多线程和pad可用性的例子。
queue2
这个元素不是队列的演变。它有相同的设计目标,但采用了不同的实现方法,这导致了不同的功能。不幸的是,通常不容易分辨哪个队列是最佳选择。
queue2 执行上面为 queue 列出的两项任务,此外,它能够将收到的数据(或部分数据)存储在磁盘文件中,以便以后检索。它还用《基础教程12:流》中描述的更通用、更方便的缓冲信息取代了信号。
作为经验法则,当网络缓冲是你关心的问题时,最好选择queue2而不是queue。请看基础教程12:流媒体的例子(queue2隐藏在playbin中)
multiqueue
这个元素为多个流同时提供队列,并简化了它们的管理,如果其他流没有收到数据,允许一些队列增长,或者如果没有连接到任何东西,允许一些队列放弃数据(而不是像一个更简单的队列那样返回一个错误)。此外,它还同步不同的流,确保没有一个流比其他流领先太多。
这是一个高级元素。它在decodebin中被用到过,但你很少需要在一个正常的播放程序中自己实例化它。
tee
基础教程7:多线程和pad的可用性已经展示了如何使用一个三通元素,它将数据分割到多个垫子。分割数据流是很有用的,例如,当捕捉视频时,视频在屏幕上显示,同时也被编码并写入文件。另一个例子是播放音乐和连接可视化模块。
人们需要在每个分支中使用单独的队列元素,为每个分支提供单独的线程。否则,一个分支中的数据流受阻会使其他分支停滞。
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的日常工作中很有用。有些元素对生产管道很有价值,而其他元素只需要用于调试目的。