GStreamer工具
目标
GStreamer 附带了一套工具,从方便到绝对必要。本教程中没有代码,坐下来放松一下,我们将教你:
-
如何从命令行构建和运行 GStreamer 管道,而无需使用 C!
-
如何了解您可用的 GStreamer 元素及其功能。
-
如何发现媒体文件的内部结构。
介绍
这些工具位于 GStreamer 二进制文件的 bin 目录中。您需要移动到此目录才能执行它们,因为它没有添加到系统的 PATH 环境变量中(以避免对它造成太大的污染)。
只需打开一个终端(或控制台窗口)并转到 GStreamer 安装的 bin 目录(再次阅读安装 GStreamer 部分以找出它的位置),然后您就可以开始键入本教程中给出的命令了。
在 Linux 上,您应该使用随发行版一起安装的 GStreamer 版本,这些工具应该在 Fedora 风格的发行版上与名为 gstreamer1 的软件包一起安装,或者在 Debian/Ubuntu 风格的发行版上与名为 - gstreamer1.0-tools 的软件包一起安装。
为了允许多个版本的 GStreamer 在同一系统中共存,这些工具进行了版本控制,即在其名称后附加 GStreamer 版本号。此版本基于 GStreamer 1.0,因此这些工具称为 gst-launch-1.0、gst-inspect-1.0 和 gst-discoverer-1.0
gst-launch-1.0
此工具接受管道的文本描述,将其实例化,并将其设置为 PLAYING 状态。它允许您在使用 GStreamer API 调用进行实际实施之前快速检查给定管道是否有效。
请记住,它只能创建简单的管道。特别是,它只能模拟流水线与应用程序的交互,直到达到一定级别。无论如何,快速测试管道非常方便,并且世界各地的 GStreamer 开发人员每天都在使用它。
请注意,gst-launch-1.0 主要是面向开发人员的调试工具。您不应在其上构建应用程序。相反,请使用 GStreamer API 的 gst_parse_launch() 函数作为从管道描述构建管道的简单方法。
尽管构造管道描述的规则非常简单,但多个元素的串联很快就会使此类描述类似于黑魔法。不要害怕,因为每个人最终都会学习 gst-launch-1.0 语法。
gst-launch-1.0 的命令行由一个选项列表和一个 PIPELINE-DESCRIPTION 组成。接下来给出了一些简化的说明,请参阅 gst-launch-1.0 参考页面上的完整文档。
Elements
简单来说,PIPELINE-DESCRIPTION 是用感叹号 (!) 分隔的元素类型列表。继续并键入以下命令:
您应该会看到一个带有动画视频图案的窗口。在终端上使用 CTRL+C 停止程序。
这将实例化 videotestsrc 类型的新元素(生成示例视频模式的元素)、videoconvert(执行原始视频格式转换的元素,确保其他元素可以相互理解)和 autovideosink(视频呈现到的窗口)。然后,GStreamer 尝试将每个元素的输出链接到描述中其右侧显示的元素的输入。如果有多个输入或输出 Pad 可用,则使用 Pad Caps 来查找两个兼容的 Pads。
属性
属性可以以 property=value 的形式附加到元素上(可以指定多个属性,用空格分隔)。使用 gst-inspect-1.0 工具(接下来将介绍)找出元素的可用属性。
您应该会看到一个由圆圈组成的静态视频图案。命名 elements
可以使用 name 属性命名元素,这样可以创建涉及分支的复杂管道。名称允许链接到之前在描述中创建的元素,并且对于使用具有多个输出pads的元素(如 demuxer 或 tees)是必不可少的。
命名元素使用其名称后跟一个点来引用。
gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
您应该会看到两个视频窗口,显示相同的示例视频模式。如果您只看到一个窗口,请尝试移动它,因为它可能位于第二个窗口的顶部。
这个例子实例化了一个 videotestsrc,链接到一个 videoconvert,链接到一个 tee(记住 基础教程 7:多线程和pad可用性 中,一个 tee 复制到它的每个输出pad,所有通过它的输入焊盘进入的东西)。tee 被简单地命名为 't' (使用 name 属性),然后链接到队列和 autovideosink。使用“t.”(注意点)表示相同的 tee,然后链接到第二个队列和第二个 autovideosink。
要了解为什么需要队列,请阅读 第7章:多线程和磁盘可用性
Pads
与其让 GStreamer 在链接两个元素时选择使用哪个 Pad,不如直接指定 Pads。为此,可以在元素名称后添加一个点和 Pad 名称(它必须是命名元素)。使用 gst-inspect-1.0 工具了解元素的 Pads 的名称。
这很有用,例如,当您想从 demuxer 中检索一个特定的流时:
gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! matroskademux name=d d.video_0 ! matroskamux ! filesink location=sintel_video.mkv
这将使用 souphttpsrc 从 Internet 获取媒体文件,它是 webm 格式(一种特殊的 Matroska 容器,请参阅基本教程 2:GStreamer 概念)。然后我们使用 matroskademux 打开容器。此媒体包含音频和视频,因此 matroskademux 将创建两个输出 Pad,分别名为 video_0 和 audio_0。我们将video_0链接到 matroskamux 元素,以将视频流重新打包到新容器中,最后将其链接到文件接收器,该文件会将流写入名为 “sintel_video.mkv” 的文件(location 属性指定文件的名称)。
总而言之,我们获取了一个 webm 文件,去除了其中的音频,并生成了一个新的 matroska 文件。如果我们只想保留音频:
gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! matroskademux name=d d.audio_0 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka
需要 vorbisparse 元素从流中提取一些信息并将其放入 Pad Cap 中,因此下一个元素 matroskamux 知道如何处理流。对于视频来说,这是不必要的,因为 matroskademux 已经提取了这些信息并将其添加到 Cap 中。
请注意,在上面的两个示例中,没有媒体被解码或播放。我们刚刚从一个容器移动到另一个容器(再次解复用和重新复用)。
Caps 过滤器
当一个元素具有多个 output pad 时,可能会发生指向下一个元素的链接不明确的情况:下一个元素可能具有多个兼容的 input pad,或者其 input pad 可能与所有输出 pad 的 Pad Caps 兼容。在这些情况下,GStreamer 将使用第一个可用的pad进行链接,这几乎相当于 GStreamer 将随机选择一个输出pad。
请考虑以下管道:
gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test
这与上一个示例中的媒体文件和解复用器相同。filesink 的输入 Pad Cap 是 ANY,这意味着它可以接受任何类型的媒体。matroskademux 的两个输出板中的哪一个将与文件接收器链接?video_0还是audio_0?你不可能知道。
不过,你可以通过使用命名的 pads(如上一小节)或使用 Caps Filters 来消除这种歧义:
gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! matroskademux ! video/x-vp8 ! matroskamux ! filesink location=sintel_video.mkv
Caps Filter 的行为类似于直通元素,它不执行任何作,并且只接受具有给定 Cap 的媒体,从而有效地解决了歧义。在此示例中,在 matroskademux 和 matroskamux 之间,我们添加了一个 video/x-vp8 Caps 过滤器,以指定我们对可以生成此类视频的 matroskademux 的输出板感兴趣。
要找出元素接受并生成的 Cap,请使用 gst-inspect-1.0 工具。要找出特定文件中包含的大写字母,请使用 gst-discoverer-1.0 工具。要找出元素为特定管道生成的 Caps,请像往常一样运行 gst-launch-1.0,并使用 –v 选项打印 Caps 信息。
例子
使用 playbin 播放媒体文件(如基本教程 1:Hello world!)
一个完全可操作的播放管道,其中包含音频和视频(或多或少与 playbin 将在内部创建的管道相同):
gst-launch-1.0 souphttpsrc location=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! matroskademux name=d ! queue ! vp8dec ! videoconvert ! autovideosink d. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
转码管道,打开 webm 容器并解码两个流(通过 uridecodebin),然后使用不同的编解码器 (H.264 + AAC) 重新编码音频和视频分支,并将它们重新组合到 MP4 容器中(只是为了它)。由于 x264enc 编码器默认的行为方式(在输出任何内容之前消耗数秒的视频输入),我们必须增加 audio 分支中队列的大小,以确保管道可以预卷和启动。另一种解决方案是使用 x264enc tune=zerolatency,但这会导致质量较低,更适合实时流式处理场景。
gst-launch-1.0 uridecodebin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm name=d ! queue ! videoconvert ! x264enc ! video/x-h264,profile=high ! mp4mux name=m ! filesink location=sintel.mp4 d. ! queue max-size-time=5000000000 max-size-bytes=0 max-size-buffers=0 ! audioconvert ! audioresample ! voaacenc ! m.
重新缩放管道。每当输入和输出上限中的帧大小不同时,videoscale 元素就会执行重新缩放作。输出上限由 Caps Filter 设置为 320x200。
gst-launch-1.0 uridecodebin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm ! queue ! videoscale ! video/x-raw,width=320,height=200 ! videoconvert ! autovideosink
gst-launch-1.0 的简短描述应该足以帮助您入门。请记住,此处提供了完整的文档。
gst-inspect-1.0
该工具有三种作模式:
- 如果没有参数,它列出了所有可用的元素类型,即你可以用来实例化新元素的类型。
- 使用文件名作为参数,它将文件视为 GStreamer 插件,尝试打开它,并列出其中描述的所有元素。
- 使用 GStreamer 元素名称作为参数,它会列出有关该元素的所有信息。
让我们看第三种模式的示例:
gst-inspect-1.0 vp8dec
Factory Details:
Rank primary (256)
Long-name On2 VP8 Decoder
Klass Codec/Decoder/Video
Description Decode VP8 video streams
Author David Schleef <ds@entropywave.com>, Sebastian Dröge <sebastian.droege@collabora.co.uk>
Plugin Details:
Name vpx
Description VP8 plugin
Filename /usr/lib64/gstreamer-1.0/libgstvpx.so
Version 1.6.4
License LGPL
Source module gst-plugins-good
Source release date 2016-04-14
Binary package Fedora GStreamer-plugins-good package
Origin URL http://download.fedoraproject.org
GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstVideoDecoder
+----GstVP8Dec
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-vp8
SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw
format: I420
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
Element Flags:
no flags set
Element Implementation:
Has change_state() function: gst_video_decoder_change_state
Element has no clocking capabilities.
Element has no URI handling capabilities.
Pads:
SINK: 'sink'
Pad Template: 'sink'
SRC: 'src'
Pad Template: 'src'
Element Properties:
name : The name of the object
flags: readable, writable
String. Default: "vp8dec0"
parent : The parent of the object
flags: readable, writable
Object of type "GstObject"
post-processing : Enable post processing
flags: readable, writable
Boolean. Default: false
post-processing-flags: Flags to control post processing
flags: readable, writable
Flags "GstVP8DecPostProcessingFlags" Default: 0x00000403, "mfqe+demacroblock+deblock"
(0x00000001): deblock - Deblock
(0x00000002): demacroblock - Demacroblock
(0x00000004): addnoise - Add noise
(0x00000400): mfqe - Multi-frame quality enhancement
deblocking-level : Deblocking level
flags: readable, writable
Unsigned Integer. Range: 0 - 16 Default: 4
noise-level : Noise level
flags: readable, writable
Unsigned Integer. Range: 0 - 16 Default: 0
threads : Maximum number of decoding threads
flags: readable, writable
Unsigned Integer. Range: 1 - 16 Default: 0
最相关的部分是:
-
Pad Templates:列出了此 element 可以具有的所有类型的 Pads 及其功能。在这里,您可以了解一个元素是否可以与另一个元素链接。在这种情况下,它只有一个 sink pad 模板,仅接受 video/x-vp8(VP8 格式的编码视频数据)和一个源 pad 模板,生成 video/x-raw(解码的视频数据)。
-
元素属性:列出元素的属性及其类型和接受的值。
有关更多信息,您可以查看 gst-inspect-1.0 的文档页面。
gst-discoverer-1.0
此工具是基本教程 9:媒体信息收集中所示的 GstDiscoverer 对象的包装器。它接受来自命令行的 URI 并打印有关 GStreamer 可以提取的媒体的所有信息。找出用于生成媒体的容器和编解码器,以及因此需要在管道中放入哪些元素才能播放媒体非常有用。
使用 gst-discoverer-1.0 --help 获取可用选项的列表,这些选项基本上控制输出的详细程度。
让我们看一个例子:
gst-discoverer-1.0 https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm -v
Analyzing https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm
Done discovering https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm
Topology:
container: video/webm
audio: audio/x-vorbis, channels=(int)2, rate=(int)48000
Codec:
audio/x-vorbis, channels=(int)2, rate=(int)48000
Additional info:
None
Language: en
Channels: 2
Sample rate: 48000
Depth: 0
Bitrate: 80000
Max bitrate: 0
Tags:
taglist, language-code=(string)en, container-format=(string)Matroska, audio-codec=(string)Vorbis, application-name=(string)ffmpeg2theora-0.24, encoder=(string)"Xiph.Org\ libVorbis\ I\ 20090709", encoder-version=(uint)0, nominal-bitrate=(uint)80000, bitrate=(uint)80000;
video: video/x-vp8, width=(int)854, height=(int)480, framerate=(fraction)25/1
Codec:
video/x-vp8, width=(int)854, height=(int)480, framerate=(fraction)25/1
Additional info:
None
Width: 854
Height: 480
Depth: 0
Frame rate: 25/1
Pixel aspect ratio: 1/1
Interlaced: false
Bitrate: 0
Max bitrate: 0
Tags:
taglist, video-codec=(string)"VP8\ video", container-format=(string)Matroska;
Properties:
Duration: 0:00:52.250000000
Seekable: yes
Tags:
video codec: VP8 video
language code: en
container format: Matroska
application name: ffmpeg2theora-0.24
encoder: Xiph.Org libVorbis I 20090709
encoder version: 0
audio codec: Vorbis
nominal bitrate: 80000
bitrate: 80000
总结
本教程展示了:
- 如何使用 gst-launch-1.0 工具从命令行构建和运行 GStreamer 管道。
- 如何使用 gst-inspect-1.0 工具找出您可用的 GStreamer 元素及其功能。
- 如何使用 gst-discoverer-1.0 发现媒体文件的内部结构。
很高兴您来到这里,很快再见!