前言
本文是GStreamer学习笔记,也可以看成是对原文的意译。
这些教程描述了理解其余教程所需的GStreamer主题。
GStreamer教程:
环境
系统环境
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Linux version : 5.3.0-46-generic ( buildd@lcy01-amd64-013 )
Gcc version: 7.5.0 ( Ubuntu 7.5.0-3ubuntu1~18.04 )
软件信息
version :
GStreamer-1.0
正文
本教程提供了值得了解的Gstreamer元素列表。它们有强大的一体化元素,能够轻松的构建复杂的管道(如Playbin),也有在调试时非常有用的辅助小元件。
1. Bins
Bin元素可以看作独立的元素,它们可以实例化所有必要的内部管道来完成任务。
1.1 playbin
它管理媒体播放的所有方面,从源到显示,通过多路复用和解码。它灵活并具有很多选项。
1.2 uridecodebin
此元素将数据从URI解码为原始媒体。它选择可以处理给定URI的源元素,并将其链接到decodebin元素。它的作用就像一个多路复用器,所以它提供了很多在流媒体中的source pad。
#video
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! videoconvert ! autovideosink
#audio
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink
1.3 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
2. File input/output
2.1 filesrc
该元素读取一个本地文件并生成任意cap的媒体。如果想获得正确的caps,可以通过typefind元素或者将filesrc的typefind属性设置为TRUE来探索流
gst-launch-1.0 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin ! autovideosink
2.2 filesink
此元素写入其所收到的所有媒体的文件。使用location属性指定文件名。
gst-launch-1.0 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg
### 3. Network
3.1 souphttpsrc
使用LibSoup库通过HTTP将网络接受数据作为客户端的数据。设置要通过位置属性检索的 URL。
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink
4. Test media generation
这些元素对于检查管道中的部分是非常有用的。通过替换这些测试的source,这些测试的source是“保证”的工作之一。
4.1 videotestsrc
此元素生一个视频模式(可通过pattern属性进行不同选择)。使用它来测试视频管道。
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
4.2 audiotestsrc
此元素产生一个音频波形(可通过wave属性进行不同选择)。用它来测试音频管道。
gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink
5. Video adapters
5.1 videoconvert
该元素从一个颜色空间(如RGB)转换为另一个颜色空间(如YUV)。它还可以在不同YUV格式之间进行转换(如I420,NV12,YUY2,…)或RGB格式排列(如RGBA,ARGB,BGRA,…)。 这通常是处理协商问题时的首选。当不需要时,因为它的上游和下游元素可以相互理解,它以直通模式工作,不会影响性能。 根据经验法则,当使用在设计时caps未知的元素(如autovideosink)时,请始终使用videoconvert,或者根据外部因素而变化的元素(如解码用户提供的文件)。
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
5.2 videorate
此元素接受带有时间戳的视频帧传入流,并生成与src pad的帧率匹配的流。通过删除和复制帧来进行校正,不使用幻想算法来插入帧。 这有助于允许不同帧率的元素链接。与其他适配器一样,如果不需要它,它以直通模式工作,不会影响性能。 因此,当实际帧率在设计时未知时,使用它是个好主意来以防万一。
gst-launch-1.0 videotestsrc ! video/x-raw,framerate=30/1 ! videorate ! video/x-raw,framerate=1/1 ! videoconvert ! autovideosink
5.3 videoscale
此元素调整来视频帧的大小。默认情况下,元素会尝试在src pad和sink pad上协商相同的大小,因此不需要进行扩展。如果不需要伸缩,则可以安全地在管道中插入此元素,以获得更健壮的行为,而无需任何成本。 该元素支持各种颜色空间,包括各种YUV和RGB格式,因此通常能够在管道中的任何位置操作。 如果将视频输出到一个由用户控制大小的窗口,那么使用videoscale元素是一个好主意,因为不是所有的sink都能执行缩放操作。
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
6. Audio adapters
6.1 audioconvert
此元素在各种可能格式之间转换原始音频缓冲区。它支持整数到浮点数转换、深度/宽度转换、符号和字节转换以及通道转换。 想videoconvert之视频一样,它可以用来解决音频的协商问题,并通常可以安全地使用它,如果不需要此元素就没有任何操作。
gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink
6.2 audiorate
此元素接受带有时间戳的原始音频帧的传入流,并根据需要来插入或删除sample来产生完美的流。它不同于videorate,它只是填补空白并删除重叠的样本,使输出流是连续的并且“clean”。 在时间戳将丢失(如存储到特定的文件格式时)和接收方将要求所有样本都存在的情况下,它非常有用。举例说明这一点非常麻烦,因此没有给出任何例子。 多数情况下,audiorate不是你想要的。
6.3 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
7. Multithreading
7.1 queue
基本上,一个queue执行两个任务:
-
数据将被排队,直到达到选定的限制。任何将更多缓冲区推入queue的尝试都会阻塞推入线程,直到有更多的可用空间为止
-
queue在src pad上创建一个新线程来分离sink pad和src pad上的处理。
此外,当queue即将变为empty或full时(根据某些可配置的阈值),queue将触发signal,并可以指示其删除缓冲区,而不是在缓冲区已塞满时阻塞。
根据经验,当不需要考虑网络缓冲时,最好使用更简单的queue而不是queue2。
7.2 queue2
此元素不是queue的演变。它具有相同的设计目标,但遵循不同的实现方法,从而产生不同的特性。然而,它通常不容易判断那个queue是最佳选择。 queue2执行上面queue列出两个任务。此外,还能够将接受到的数据(或其中一部分)存储到磁盘文件上,以便稍后检索,更方便的缓冲消息替换了信号。 根据经验,当需要考虑网络缓冲时,首选queue2而非queue。
7.3 multiqueue
此元素同时提供了多个流queue,来缓解管理,通过允许一些queue增长,如果没有接收其他数据流;或允许一些queue删除数据,如果没有链接任何数据。此外,它还同步不同的流,确保它们中没有一个走在其他流前面太远。 这是一个高级元素。它位于decodebin中,但很少需要在正常的播放应用程序中自动化。
7.4 tee
将数据拆分给多个pad。拆分数据流是很有用的,例如,当捕获一个视频时,视频显示在屏幕上,同时编码写入文件。另一个例子是播放音乐并连接可视化模块。 可以在每个分支中使用单独的queue元素来为每个分支提供单独的线程。否则,一个分支中阻塞的数据流将会停止其他分支。
gst-launch-1.0 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! videoconvert ! autovideosink
8. Capabilities
8.1 capsfilter
使用gst-launch-1.0了解capsfilter。以编程的方式构建管道时,capsfilter使用capfilter元素实现。此元素不会根据数据进行修改,但强制对数据格式进行限制。
gst-launch-1.0 videotestsrc ! video/x-raw, format=GRAY8 ! videoconvert ! autovideosink
可以使用使用Caps Filters来消除这种歧义:
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! video/x-vp8 ! matroskamux ! filesink location=sintel_video.mkv
Caps filters的行为就像是传递元素,它什么都不做,只接受具有给定Caps的媒体,从而有效地解决了歧义。 在此示例中,在matroskademux和matroskamux之间,我们添加了一个video/x-vp8 Caps filters,以指定我们对可以产生这种视频的matroskademux的pad感兴趣。 要找出elements接受并产生的Caps,请使用gst-inspect-1.0工具。 要查找包含在特定文件中的Caps,请使用gst-discoverer-1.0工具。 要找出element为特定pipeline生成的Caps,请照常运行gst-launch-1.0,并带有–v选项以打印Caps信息。
8.2 typefind
此元素确定流包含的介质类型。它按照级别的顺序应用typefind函数。一旦检测到该类型,它将其src pad cap设置为找到的媒体类型,并发出have-type信号。 它由decodebin内部实例化,也可以用它来查找媒体类型,通常使用GstDiscoverer来提供更多信息。
9. Debugging
9.1 fakesink
这个接收器元素简单的吞下所有提供给它的数据。在调试时,替换常规的sink并将它们排除在外是很有用的。当与gst-launch-1.0 -v结合使用时,它可能会非常冗长,所以使用silent属性来消除任何不必要的噪音。
gst-launch-1.0 audiotestsrc num-buffers=1000 ! fakesink sync=false
9.2 identity
这是一个虚拟元素,它通过未修改的方式传递传入数据。它有几个有用的诊断功能,例如偏移和时间戳检查或缓冲区丢弃。
gst-launch-1.0 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink
结论
本教程罗列了9大元素,因为这9大元素在GStreamer的日常工作中很有用。