GStreamer Basic tutorial 10 GStreamer Tools

"GStreamer 基本教程10: GStreamer 工具"

Posted by Stephen on March 22, 2022

前言

本文是GStreamer学习笔记,也可以看成是对原文的意译。

这些教程描述了理解其余教程所需的GStreamer主题。

GStreamer教程:

基础教程 : GStreamer 介绍

基础教程 1: Hello world!

基础教程 2: GStreamer 概念

基础教程 3: 动态管道

基础教程 4: 时间管理

基础教程 5: GUI工具包集成

基础教程 6: 媒体格式和pad功能

基础教程 7: 多线程和Pad可用性

基础教程 8: 管道短路操作

基础教程 9: 媒体信息收集

基础教程 10: GStreamer工具

基础教程 11: 调试工具

基础教程 12: 流媒体

基础教程 13: 播放速度

基础教程 14: 有用的元素

基础教程 16: 特定平台元素

环境

系统环境

Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     GStreamer-1.0

正文

1. 目标

GStreamer 附带了一组工具,从方便到绝对必要。本教程没有代码,高枕无忧,我们将教你:

  • 如何从命令行构建和运行 GStreamer 管道,而不使用 C!
  • 如何找出可用的 GStreamer 元素及其功能。
  • 如何发现媒体文件的内部结构。

2. 介绍

这些工具在 GStreamer 二进制文件的 bin 目录中可用。你需要移动到这个目录来执行它们,因为它没有添加到系统的PATH环境变量中(避免过多的污染)。

只需打开一个终端(或控制台窗口)并转到bin您的 GStreamer 安装目录(再次阅读安装 GStreamer部分以了解其位置),您就可以开始输入本教程中给出的命令了。

在 Linux 上,您应该使用与您的发行版一起安装的 GStreamer 版本,这些工具应该与一个名为gstreamer1 Fedora 风格发行版或gstreamer1.0-toolsDebian/Ubuntu 风格发行版的软件包一起安装。

为了允许多个版本的 GStreamer 在同一个系统中共存,这些工具是版本化的,即在其名称后附加一个 GStreamer 版本号。这个版本是基于 GStreamer 1.0 的,所以工具叫gst-launch-1.0, gst-inspect-1.0gst-discoverer-1.0

2.1 gst-launch-1.0

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

请记住,它只能创建简单的管道。特别是,它只能模拟管道与应用程序的交互,达到一定程度。无论如何,快速测试管道非常方便,并且每天都被世界各地的 GStreamer 开发人员使用。

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

虽然构建管道描述的规则非常简单,但多个元素的串联可以很快使这样的描述像黑魔法一样。不要害怕,因为每个人 gst-launch-1.0最终都会学习语法。

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

2.1.1 元素

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

  gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

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

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

2.1.2 属性

属性可以附加到元素上,格式为 *property=value *(可以指定多个属性,用空格分隔)。使用该gst-inspect-1.0工具(接下来将说明)找出元素的可用属性。

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

您应该看到一个由圆圈组成的静态视频图案。

2.1.3 命名元素

可以使用name属性命名元素,这样可以创建涉及分支的复杂管道。名称允许链接到之前在描述中创建的元素,并且对于使用具有多个输出焊盘的元素是必不可少的,例如解复用器或三通。

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

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

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

这个例子实例化了 a videotestsrc,链接到 a videoconvert,链接到 a tee(请记住基础教程 7: 多线程和Pad可用性,atee复制到它的每个输出填充所有通过其输入填充的内容)。被tee简单地命名为“t”(使用name属性),然后链接到 aqueue和 an autovideosinktee使用“t”表示相同。(注意点),然后链接到 second queue和 second autovideosink

要了解为什么需要队列,请阅读基础教程 7: 多线程和Pad可用性

2.1.4 pad

在链接两个元素时,您可能希望直接指定 Pad,而不是让 GStreamer 选择使用哪个 Pad。您可以通过在元素名称后添加一个点和 Pad 名称来完成此操作(它必须是命名元素)。使用该gst-inspect-1.0工具了解元素的 Pads 的名称。

这很有用,例如,当您想从分路器中检索一个特定的流时:

  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 概念)从 Internet 获取媒体文件。然后我们使用matroskademux. 此媒体包含音频和视频,因此matroskademux将创建两个输出 Pad,分别命名为 video_0audio_0。我们链接video_0到一个matroskamux元素以将视频流重新打包到一个新容器中,最后将其链接到 a 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 中。

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

2.1.5 功能过滤

当一个元素有多个输出焊盘时,可能会发生到下一个元素的链接不明确:下一个元素可能有多个兼容的输入焊盘,或者它的输入焊盘可能与所有输出的 Pad Caps 兼容垫。在这些情况下,GStreamer 将使用第一个可用的焊盘进行链接,这几乎等于说 GStreamer 将随机选择一个输出焊盘。

考虑以下管道:

  gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test

这与前一个示例中的媒体文件和解复用器相同。的输入 Pad CapsfilesinkANY,表示它可以接受任何类型的媒体。两个输出焊盘中的哪一个matroskademux将与文件接收器链接?video_0还是audio_0?你无法知道。

但是,您可以通过使用命名垫(如前小节中所述)或使用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 过滤器的行为就像一个传递元素,它什么都不做,只接受具有给定 Caps 的媒体,有效地解决了歧义。在这个例子中,matroskademux我们matroskamux添加了一个video/x-vp8Caps Filter 来指定我们感兴趣的输出焊盘matroskademux可以产生这种视频。

要找出元素接受和产生的 Caps,请使用该 gst-inspect-1.0工具。要找出特定文件中包含的 Caps,请使用该gst-discoverer-1.0工具。要找出某个元素为特定管道生成的 Caps,gst-launch-1.0请照常运行, –v并可选择打印 Caps 信息。

2.1.6 例子

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.

重新缩放管道。videoscale只要输入和输出大写的帧大小不同,该元素就会执行重新缩放操作。输出上限由 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应该足以让您入门。请记住,您可以在此处获得完整的文档

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

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

2.3 gst-discoverer-1.0

此工具是基础教程 9: 媒体信息收集GstDiscoverer中所示对象的包装。它接受来自命令行的 URI 并打印有关 GStreamer 可以提取的媒体的所有信息。找出用于制作媒体的容器和编解码器以及因此需要将哪些元素放入管道中来播放它很有用。

用于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

3. 结论

本教程显示:

  • gst-launch-1.0如何使用该工具从命令行构建和运行 GStreamer 管道。
  • gst-inspect-1.0如何使用该工具找出您可用的 GStreamer 元素及其功能。
  • 如何发现媒体文件的内部结构,使用 gst-discoverer-1.0.

后记