GStreamer tools

GStreamer tools

目标

GStreamer附带了从方便的到绝对必要的一组工具。在本教程中没有代码,只是坐下来放松,我们将教你:

  • 如何从命令行构建和运行 GStreamer pipeline,完全不使用 C!
  • 如何找出可用的 GStreamer element及其capabilities。
  • 如何发现媒体文件的内部结构。

介绍

这些工具位于 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

此工具接受pipeline的文本描述,将其实例化,并将其设置为 PLAYING 状态。它允许您在使用 GStreamer API 调用进行实际实现之前快速检查给定的pipeline是否有效。

请记住,它只能创建简单的pipeline。特别是,它只能在一定程度上模拟pipeline与应用程序的交互。在任何情况下,快速测试pipeline都非常方便,世界各地的 GStreamer 开发人员每天都在使用它。

请注意,gst-launch-1.0 主要是开发人员的调试工具。您不应该在它之上构建应用程序。相反,使用 GStreamer API 的 gst_parse_launch() 函数作为从pipeline描述构建pipeline的简单方法。

虽然构建pipeline描述的规则非常简单,但多个element的串联可以很快使这种描述类似于黑魔法。不要害怕,因为每个人最终都会学习 gst-launch-1.0 语法。

gst-launch-1.0 的命令行包含一个选项列表,后跟一个 PIPELINE-DESCRIPTION。接下来给出了一些简化的说明,请参阅 gst-launch-1.0 参考页面上的完整文档。

Element

简单来说,PIPELINE-DESCRIPTION 是由感叹号 (!) 分隔的element类型列表。继续并输入以下命令:

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

您应该会看到一个带有动画视频模式的窗口。 在终端上使用 CTRL+C 停止程序。

这将实例化一个 videotestsrc 类型的新element(一个生成样本视频模式的element)、一个 videoconvert(一个进行原始视频格式转换的element,确保其他element可以相互理解)和一个 autovideosink(一个视频窗口 渲染)。 然后,GStreamer 尝试将每个element的输出链接到描述中出现在其右侧的element的输入。 如果有多个输入或输出pad可用,则使用pad caps来查找两个兼容的pad。

属性

属性可以附加到element,格式为 *property=value *(可以指定多个属性,用空格分隔)。 使用 gst-inspect-1.0 工具(接下来解释)找出element的可用属性。

gst-launch-1.0 videotestsrc pattern=11 ! videoconvert ! autovideosink

您应该会看到一个由圆圈组成的静态视频模式。

命名element

Element可以使用 name 属性命名,这样可以创建涉及分支的复杂pipeline。 名称允许链接到之前在描述中创建的element,并且对于使用具有多个输出pad的element是必不可少的,例如demuxers 或tees。

命名element使用其名称后跟一个点来引用。

gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink

您应该看到两个视频窗口,显示相同的样本视频模式。 如果您只看到一个,请尝试移动它,因为它可能位于第二个窗口的顶部。

此示例实例化一个 videotestsrc,链接到一个 videoconvert,链接到一个 tee(tee 复制到其每个输出pad的所有内容都通过其输入pad)。 tee 被简单地命名为“t”(使用 name 属性),然后链接到queue和 autovideosink。 使用“t.”(注意点)引用同一个 tee,然后链接到第二个queue和第二个 autovideosink。

Pads

与其让 GStreamer 在链接两个element时选择使用哪个 Pad,不如直接指定 Pad。 您可以通过在element名称后添加一个点和 Pad 名称来实现(它必须是一个命名element)。 使用 gst-inspect-1.0 工具了解element的 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 将创建两个输出 Pad,分别命名为 video_0 和 audio_0。 我们将 video_0 链接到 matroskamux element以将视频流重新打包到一个新的容器中,最后将其链接到一个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 element从流中提取一些信息并将其放入 Pad Caps 中,因此下一个element matroskamux 知道如何处理流。 在视频的情况下,这不是必需的,因为 matroskademux 已经提取了此信息并将其添加到 Caps。

请注意,在上述两个示例中,没有媒体被解码或播放。 我们刚刚从一个容器移动到另一个容器(重新解复用和重新复用)。

Caps filters

当一个element有多个输出pad时,可能会发生下一个element的链接不明确的情况:下一个element可能有多个兼容的输入pad,或者它的输入pad可能与所有输出的 Pad Caps 兼容 pad。 在这些情况下,GStreamer 将使用第一个可用的pad进行链接,这几乎等于说 GStreamer 将随机选择一个输出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 的输入 Pad Caps 是 ANY,这意味着它可以接受任何类型的媒体。 matroskademux 的两个输出pad中的哪一个将链接到文件接收器? video_0 还是audio_0? 你不可能知道。

但是,您可以通过使用命名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 Filter的行为就像一个传递element,它什么都不做,只接受具有给定 Caps 的媒体,有效地解决了歧义。 在这个例子中,在 matroskademux 和 matroskamux 之间我们添加了一个 video/x-vp8 Caps Filter 来指定我们对 matroskademux 的输出pad感兴趣,它可以产生这种视频。

要找出element接受和生成的 Caps,请使用 gst-inspect-1.0 工具。 要找出特定文件中包含的caps,请使用 gst-discoverer-1.0 工具。 要找出element为特定生成的 Caps,请照常运行 gst-launch-1.0,并使用 –v 选项打印 Caps 信息。

例子

使用 playbin 播放媒体文件:

gst-launch-1.0 playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm

一个完整的运行的播放pipeline,带有音频和视频(或多或少与playbin内部创建的pipeline相同):

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.

执行缩放的pipeline。当输入和输出caps中的帧大小不同时,videoscale element执行缩放操作。输出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

对gst-launch-1.0的简短描述应该足以让您入门。请记住,您可以在这里获得完整的文档。

gst-inspect-1.0

该工具具有三种操作模式:

  • 没有参数,它列出了所有可用的element类型,即可以用来实例化新element的类型。
  • 以文件名作为参数,它将文件视为 GStreamer 插件,尝试打开它,并列出其中描述的所有element。
  • 以 GStreamer element名称作为参数,它列出了有关该element的所有信息。

让我们看一下第三种模式的例子:

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可以拥有的所有类型的 Pad,以及它们的capabilities。 您可以在这里查看一个element是否可以与另一个element链接。 在这种情况下,它只有一个 sink pad 模板,只接受 video/x-vp8(VP8 格式的编码视频数据)和一个 source pad 模板,产生 video/x-raw(解码的视频数据)。
  • element属性:这列出了element的属性,以及它们的类型和接受的值。

有关更多信息,您可以查看 gst-inspect-1.0 的文档页面。

gst-discover-1.0

它接受来自命令行的 URI 并打印有关 GStreamer 可以提取的媒体的所有信息。 找出用于制作媒体的容器和编解码器,以及您需要将哪些element放入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

总结

本教程展示了:

  • 如何使用 gst-launch-1.0 工具从命令行构建和运行 GStreamer pipeline。
  • 如何使用 gst-inspect-1.0 工具找出可用的 GStreamer element及其capabilities。
  • 如何发现媒体文件的内部结构,使用 gst-discoverer-1.0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值