由于工作原因,用的GStreamer的图像解码库,所以记录GStreamer Tutorial 的中文翻译和个人的理解以便学习。若有不足请多指教。侵删。
GStreamer附带了一组工具,范围从方便到绝对必要。本教程中没有代码,只需坐下来放松,我们将教你:
这些工具可以在GStreamer二进制文件的bin目录中找到。您需要移动到这个目录来执行它们,因为它没有添加到系统的PATH环境变量中(以避免过多地污染它)。
只需打开一个终端(或控制台窗口),并进入GStreamer安装的bin目录(请再次阅读安装GStreamer一节,以了解它在哪里),然后就可以开始输入本教程中给出的命令了。
为了允许GStreamer的多个版本同时存在于同一个系统中,这些工具都进行了版本控制,也就是说,在它们的名称后面附加一个GStreamer版本号。这个版本基于GStreamer 1.0,因此这些工具被称为gst-launch-1.0
、gst-inspect-1.0
和gst-discoverer-1.0
gst-launch-1.0
该工具接受pipeline
的文本描述,实例化它,并将其设置为PLAYING状态。它允许您在使用GStreamer API
调用进行实际实现之前,快速检查给定的pipeline
是否工作。
请记住,它只能创建简单的pipeline
。特别是,它只能在一定程度上模拟pipeline
与应用程序的交互。在任何情况下,快速测试pipeline
都非常方便,世界各地的GStreamer开发人员每天都在使用它。
请注意,gst-launch-1.0
主要是供开发人员使用的调试工具。您不应该在此基础上构建应用程序。相反,使用GStreamer API
的gst_parse_launch()
函数作为从pipeline
描述构造pipeline
的简单方法。
虽然构建管道描述的规则非常简单,但多个元素的连接可以很快使这种描述类似于黑魔法。不用担心,因为每个人最终都会学习gst-launch-1.0
语法
gst-launch-1.0
的命令行由一个选项列表和一个pipelin - description
组成。下面给出了一些简化的说明,请参阅gst-launch-1.0
的参考页中的完整文档。
在简单的形式中,PIPELINE-DESCRIPTION
是由感叹号(!)分隔的元素类型列表。继续,输入以下命令:
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
您应该会看到一个带有动画视频模式的窗口。在终端上使用CTRL+C停止程序。
这将实例化一个videotestsrc
类型的新元素(一个生成示例视频模式的元素)、一个videoconvert
(一个执行原始视频格式转换的元素,确保其他元素可以相互理解)和一个autovideosink
(一个呈现视频的窗口)。然后,GStreamer尝试将每个元素的输出链接到描述中出现在其右侧的元素的输入。如果有多个输入或输出Pad
可用,则用Pad Caps
来找到两个兼容的Pad
。
属性可以被附加到元素中,形式为 property=value (可以指定多个属性,用空格分隔)。使用gst-inspect-1.0
工具(下面将介绍)找出元素的可用属性。
gst-launch-1.0 videotestsrc pattern=11 ! videoconvert ! autovideosink
你应该看到一个静态的视频模式,由圆圈组成。
元素可以使用name
属性命名,通过这种方式可以创建包含分支的复杂pipeline
。名称允许链接到前面描述中创建的元素,并且对于使用多个output pad
的元素是必不可少的,例如demuxers
或tee
。
命名元素使用它们的名称后跟一个点来引用。
gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
您应该看到两个视频窗口,显示相同的示例视频模式。如果您只看到一个,请尝试移动它,因为它可能在第二个窗口的顶部。
这个例子实例化了一个videotestsrc
,链接到一个videoconvert
,链接到一个tee
(请记住基本教程7:多线程和Pad可用性,tee将所有通过input pad
的内容复制到每个output pad
)。tee
被简单地命名为“t”(使用name属性),然后链接到一个queue
和一个autovideosink
。同样的tee
被称为t。(注意.
),然后链接到第二个queue
和第二个autovideosink
。
要了解为什么queue
是必要的,请阅读Basic tutorial 7: Multithreading and Pad Availability。
Pads
在链接两个元素时,您可能希望直接指定Pads
,而不是让GStreamer选择使用哪个Pad
。您可以通过在元素名称后面添加一个点加上Pad
名称(它必须是一个命名元素)来实现这一点。通过使用gst-inspect-1.0
工具了解元素的Pads的名称。
这是有用的,例如,当你想从demuxer检索一个特定的流:
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
它使用souphttpsrc
从互联网获取一个媒体文件,该文件是webm格式的(一种特殊的Matroska
容器,请参阅基础教程2:GStreamer概念)。然后我们用matroskademux
打开容器。该媒体包含音频和视频,因此matroskademux
将创建两个output pads
,分别名为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
。
意,在上述两个例子中,没有媒体被解码或播放。我们只是从一个容器转移到另一个容器(再次进行解复用和再复用)。
PS:那么如何把一份视频完整的保存下来呢?或者说如何把音频和视频合在一起。
当一个元素有多个output pad
时,可能会发生到下一个元素的链接是模糊的:下一个元素可能有多个兼容的input pad
,或者它的intput pad
可能与所有output pad
的pad Caps
兼容。在这些情况下,GStreamer将使用第一个可用的pad
进行链接,这基本上相当于说GStreamer将随机选择一个output pad
。
考虑如下的 pipeline
:
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test
这是与前面示例相同的媒体文件和解耦器。filesink
的input pad Caps
是ANY,这意味着它可以接受任何类型的媒体。matroskademux
的两个输出垫中的哪一个将被链接到filesink
上?video_0
还是audio_0
是无法控制的。
不过,你可以通过使用命名的pads
(如前一小节中所述)或使用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 Filter
的行为类似于一个pass-through元素,它什么也不做,只接受带有给定Caps的媒体,这有效地解决了模糊性问题。在这个例子中,我们在matroskademux
和matroskamux
之间添加了一个video/x-vp8 Caps Filter
来指定我们对matroskademux
的哪个outputpad
感兴趣,它可以产生这种视频。
要找出一个元素接受和产生的Caps,请使用·gst-inspect-1.0·工具。要找出特定文件中包含的Caps,请使用gst-discoverer-1.0工具。要找出一个元素为特定pipeline
产生的Caps,可以像往常一样运行gst-launch-1.0,使用-v选项打印Caps信息。
使用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
一个转码管道,它打开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.
PS: 这边运行的时候报错了,缺少一致的协议,类似这种错误应该是缺了一个videoconvert,但是加在哪里不确定。命令中theoraenc
代表什么也不确定。
重新调节管道。当帧大小在输入和输出caps中不同时,视频尺度元素执行缩放操作。输出caps由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
这个运行也报错,应该是格式设置的不对,并不是video/x-raw-yuv的。将其改为video/x-raw就可以运行了。
本文对gst-launch-1.0的简短描述应该足以让您入门了。请记住,这里提供了完整的文档。
gst-inspect-1.0
该工具有三种操作模式:
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
最相关的部分是:
gst-discoverer-1.0
该工具是基础教程9:媒体信息收集中所示的GstDiscoverer
对象的包装器。它从命令行接受一个URI,并输出GStreamer可以提取的有关媒体的所有信息。了解使用了哪些容器和编解码器来生成媒体,以及需要在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
这个例程展示了: