文章目录
1. Goal
GStreamer附带了一系列工具,从方便到绝对必要。 本教程中没有代码,请坐下来放松身心,我们将教您:
- 如何在不使用C的情况下从命令行构建和运行GStreamer管道
- 如何找出可用的GStreamer元素及其功能
- 如何发现媒体文件的内部结构。
2. 介绍
这些工具位于GStreamer二进制文件的bin目录中。 您需要移动到该目录来执行它们,因为它没有添加到系统的PATH环境变量中(以避免过多污染它)。
只需打开一个终端(或控制台窗口)并转到GStreamer安装的bin目录(再次阅读Installation GStreamer部分,以找到我们的位置),就可以开始键入本教程中给出的命令了。
为了允许多个版本的GStreamer在同一系统*存,对这些工具进行了版本控制,即,在其名称后附加了一个GStreamer版本号。 此版本基于GStreamer 1.0,因此这些工具称为gst-launch-1.0,gst-inspect-1.0和gst-discoverer-1.0。
3. gst-lanuch-1.0
该工具接受pipeline的文本描述,实例化它,并将其设置为PLAYING状态。 它允许您在使用GStreamer API调用进行实际实现之前,快速检查给定的pipeline是否有效。
请记住,它只能创建简单的pipeline。 特别是,它最多只能模拟pipeline与应用程序的交互。 无论如何,快速测试pipeline非常方便,并且全世界的GStreamer开发人员每天都在使用它。
请注意,gst-launch-1.0主要是开发人员的调试工具。 您不应该在此基础上构建应用程序。 而是使用GStreamer API的gst_parse_launch函数作为从pipeline描述构造pipeline的简便方法。
尽管构造pipeline描述的规则非常简单,但是多个元素的串联可以使这些描述很快变得像黑魔法。不要害怕,因为每个人最终都会学习gst-launch-1.0语法。
gst-launch-1.0的命令行由一个选项列表和一个PIPELINE-DESCRIPTION组成。 接下来给出一些简化的说明,请参阅参考页上有关gst-launch-1.0的完整文档。
以下命令需要把autovideosink替换成ximagesink能成功运行
3.1 Elements
简而言之,PIPELINE-DESCRIPTION是由感叹号(!)分隔的元素类型列表。继续并输入以下命令:
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
您应该看到带有动画视频图案的窗口。 在终端上使用CTRL + C停止程序。
这将实例化一个videotestsrc类型的新元素(一个生成示例视频模式的元素),一个videoconvert(一个进行原始视频格式转换,确保其他元素可以相互理解的元素)和一个autovideosink(一个视频窗口) 呈现)。 然后,GStreamer尝试将每个元素的输出链接到描述中右侧出现的元素的输入。 如果有多个输入或输出Pad,则Pad Caps用于查找两个兼容Pad。
3.2 Properties
属性可以以property = value(可以指定多个属性,用空格分隔)的形式附加到元素上。使用gst-inspect-1.0工具(接下来说明)来查找元素的可用属性。
gst-launch-1.0 videotestsrc pattern=11 ! videoconvert ! autovideosink
您应该看到一个由圆圈组成的静态视频模式。
3.3 Named elements
可以使用name属性来命名elements,这样可以创建涉及分支的复杂pipeline。名称允许链接到描述中先前创建的elementes,并且对于使用具有多个输出pad的elements(例如,解复用器或tee)必不可少。
使用其名称后跟一个点来引用已命名elements。
gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
您应该看到两个视频窗口,显示相同的示例视频模式。 如果只看到一个,请尝试将其移动,因为它可能位于第二个窗口的顶部。
3.4 Pads
您可能不希望让GStreamer选择在链接两个elements时要使用哪个Pad,而是可以直接指定Pad。 您可以通过在elements名称之后添加点号和Pad名称(必须是命名elements)来做到这一点。 使用gst-inspect-1.0工具了解pad的名称。
例如,当您要从解复用器中检索一个特定的流时,这很有用:
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux name=d d.video_0 ! matroskamux ! filesink location=sintel_video.mkv
这使用webm格式(一种特殊的Matroska容器,请参阅基本教程2:GStreamer概念)使用souphttpsrc从Internet上获取媒体文件。 然后,我们使用matroskademux打开容器。 该媒体包含音频和视频,因此matroskademux将创建两个输出Pad,分别名为video_0和audio_0。 我们将video_0链接到matroskamux元素,以将视频流重新打包到一个新的容器中,最后将其链接到一个filesink,filesink会将流写入一个名为"sintel_video.mkv"的文件中(location属性指定了 文件)。
总之,我们取了一个webm文件,剥离了它的音频,并生成了一个新的matroska文件和视频。如果我们只想保留音频:
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux name=d d.audio_0 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka
需要vorbisparse元素从流中提取一些信息并将其放入Pad Caps中,因此下一个元素matroskamux知道如何处理该流。 对于视频,这不是必需的,因为matroskademux已经提取了此信息并将其添加到Caps中。
注意,在以上两个示例中,没有媒体被解码或播放。 我们刚从一个容器移动到另一个容器(再次进行多路分解和重新多路复用)。
3.5 Caps filters
当一个elements具有多个输出pads时,可能会发生与下一个element的链接不明确的情况:下一个element可能具有多个兼容的输入pad,或者其输入pads可能与所有输出的pads兼容。 在这些情况下,GStreamer将使用可用的第一个pad进行链接,这几乎等于说GStreamer将随机选择一个输出pad。
考虑以下管道:
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test
这是与上一个示例相同的媒体文件和解复用器。 filesink的输入Pad Caps是ANY,表示它可以接受任何类型的媒体。 matroskademux的两个输出pad中的哪个将与文件接收器链接?video_0或audio_0? 并不知道
不过,可以使用上一个小节中所述的named pad或使用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信息。
3.6 Examples
- 使用playbin播放媒体文件(如基本教程1:Hello world!):
gst-launch-1.0 playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm
- 具有音频和视频的完全操作的播放管道(与playbin会在内部创建的管道大致相同):
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux name=d ! queue ! vp8dec ! videoconvert ! autovideosink d. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
- 转码pipeline打开webm容器并解码两个流(通过uridecodebin),然后使用不同的编解码器重新编码音频和视频分支,并将它们放回Ogg容器中(仅出于此目的)。
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm name=d ! queue ! theoraenc ! oggmux name=m ! filesink location=sintel.ogg d. ! queue ! audioconvert ! audioresample ! flacenc ! m.
- 重新缩放管道。 只要输入和输出caps的帧大小不同,videoscale元素都会执行重新缩放操作。 输出pad由Caps Filter设置为320x200。
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! queue ! videoscale ! video/x-raw-yuv,width=320,height=200 ! videoconvert ! autovideosink
4. 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 Template:此列表列出了此元素可以具有的所有pad及其caps。 您可以在此处查找某个element是否可以与另一个element链接。 在这种情况下,它只有一个sink pad templates,仅接受video/x-vp8(VP8格式的编码视频数据),只有一个src pad templates,产生video/x-raw(解码的视频数据)
- Element Properties:列出element的属性及其类型和可接受的值
5. gst-discoverer-1.0
此工具是对基础教程9的包装。 它从命令行接受URI,并打印有关GStreamer可以提取的媒体的所有信息。找出使用了哪些容器和编解码器来制作媒体,以及因此需要将哪些elements放入pipeline中播放媒体是很有用的。
使用gst-discoverer-1.0 --help获取可用选项的列表,这些选项基本上控制输出的详细程度。
让我们来看一个例子:
gst-discoverer-1.0 https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm -v
Analyzing https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm
Done discovering https://www.freedesktop.org/software/gstreamer-sdk/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
6. Conclusion
本教程显示:
- 如何使用gst-launch-1.0工具从命令行构建和运行GStreamer pipeline
- 如何使用gst-inspect-1.0工具找出可用的GStreamer elements及其caps
- 如何使用gst-discoverer-1.0发现媒体文件的内部结构