Gstreamer基础教程10: Gstreamer 工具

文章目录

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

  1. 使用playbin播放媒体文件(如基本教程1:Hello world!):
gst-launch-1.0 playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm
  1. 具有音频和视频的完全操作的播放管道(与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
  1. 转码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.
  1. 重新缩放管道。 只要输入和输出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发现媒体文件的内部结构
上一篇:Gstreamer基础教程9: 媒体信息采集


下一篇:DeepStream插件Gstreamer(一):概述