1. 程式人生 > >gstream學習10-GStreamer tools

gstream學習10-GStreamer tools

Goal

這一節沒有程式碼,主要教一些列工具的使用。包括:如何不使用C編譯執行GStream的管道。如何查詢需要的element及能力集。如何發現媒體檔案的內部結構。

GStreamer comes with提供 a set of tools which range from handy便利 to absolutely essential必需品. There is no code in this tutorial, just sit back and relax高枕無憂, and we will teach you:

  • How to build and run GStreamer pipelines from the command line, without using C at all!
  • How to find out what GStreamer elements you have available and their capabilities.
  • How to discover the internal structure of media files.

Introduction

這些工具位於GStream的bin檔案中,到指定目錄(比如D:\gstreamer\1.0\x86_64\bin)使用cmd執行即可。

These tools are available in the bin directory of the GStreamer binaries檔案. You need to move to this directory to execute them, because it is not added to the system’s PATH

 environment variable (to avoid polluting汙染 it too much).

Just open a terminal (or console window) and go to the bin directory of your GStreamer installation (Read again the Installing GStreamer section to find our where this is), and you are ready to start typing打字 the commands given in this tutorial.

llinux最好使用隨發行版本對應的工具。

On Linux, you should use the GStreamer version installed with your distribution, the tools should be installed with a package named gstreamer1 on Fedora style distributions, or gstreamer1.0-tools on Debian/Ubuntu style distributions.

In order to allow for multiple versions of GStreamer to coexists共存 in the same system, these tools are versioned, this is, a GStreamer version number is appended to their name. This version is based on GStreamer 1.0, so the tools are called gst-launch-1.0gst-inspect-1.0 and gst-discoverer-1.0

gst-launch-1.0發動執行

此工具接收關於pipeline的文字描述,然後模擬執行。此工具僅能進行簡單模擬,主要是應用層相關的pipeline的操作,主要是給開發人員使用。

This tool accepts a textual description of a pipeline, instantiates it, and sets it to the PLAYING state. It allows you to quickly check if a given pipeline works, before going through the actual implementation實現 using GStreamer API calls.

Bear in mind that it can only create simple pipelines. In particular尤其, it can only simulate模仿 the interaction相關 of the pipeline with the application up to a certain level一定層次. In any case, it is extremely handy非常方便 to test pipelines quickly, and is used by GStreamer developers around the world on a daily basis.

gst-launch-1.0僅僅是開發者的一個除錯工具,不要妄圖在上邊開發程式。

Please note that gst-launch-1.0 is primarily主要 a debugging tool for developers. You should not build applications on top of it. Instead, use the gst_parse_launch() function of the GStreamer API as an easy way to construct pipelines from pipeline descriptions.

gst-launch-1.0語法不害怕,誰都能學會。

Although the rules to construct pipeline descriptions are very simple, the concatenation串聯 of multiple elements can quickly make such descriptions resemble類似 black magic. Fear not, for everyone learns the gst-launch-1.0 syntax語法, eventually.

gst-launch-1.0有很多語法,接下來會介紹一些,更詳細的將參考文件。

The command line for gst-launch-1.0 consists of a list of options followed by a PIPELINE-DESCRIPTION. Some simplified instructions are given next, see the complete documentation at the reference page for gst-launch-1.0.

Elements

gst-launch-1.0命令之間使用感嘆號分割,輸入下邊命令,試試效果

In simple form, a PIPELINE-DESCRIPTION is a list of element types separated by exclamation marks (!)感嘆號. Go ahead and type in the following command:

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

You should see a windows with an animated活動的 video pattern. Use CTRL+C on the terminal to stop the program.

這就是效果圖,gst-launch-1.0會把他們連線起來,具體之前意見介紹過了。當然中間不加videocovert也是可以的。

 

This instantiates a new element of type videotestsrc (an element which generates a sample video pattern), an videoconvert (an element which does raw video format conversion, making sure other elements can understand each other), and an autovideosink (a window to which video is rendered). Then, GStreamer tries to link the output of each element to the input of the element appearing on its right in the description. If more than one input or output Pad is available, the Pad Caps are used to find two compatible Pads.

Properties

可以通過property=value設定屬性,多個屬性用空格隔開,具體支援屬性可以通過接下來的工具gst-inspect-1.0獲取。

Properties may be appended to elements, in the form *property=value *(multiple properties can be specified, separated by spaces). Use the gst-inspect-1.0 tool (explained next接下來解釋) to find out the available properties for an element.

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

You should see a static video pattern, made of circles.

Named elements

可以給element命名,命名規則是name=?,使用element的時候,只要加上名字跟一個.即可。如下邊例子。給tee命名為t,後邊通過t.來應用

Elements can be named using the name property, in this way complex pipelines involving branches can be created. Names allow linking to elements created previously向前的 in the description, and are indispensable to必不可少 use elements with multiple output pads, like demuxers or tees, for example.

Named elements are referred to using their name followed by a dot.

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

You should see two video windows, showing the same sample video pattern. If you see only one, try to move it, since it is probably on top of the second window.

This example instantiates a videotestsrc, linked to a videoconvert, linked to a tee (Remember from Basic tutorial 7: Multithreading and Pad Availability that a tee copies to each of its output pads everything coming through its input pad). The tee is named simply ‘t’ (using the name property) and then linked to a queue and an autovideosink. The same tee is referred to using ‘t.’ (mind the dot) and then linked to a second queue and a second autovideosink.

Pads

我們可以手動指定pad而不是讓element自動連線。pad指定必須給element命名,然後通過名稱指定具體pad。有哪些pad可以通過工具gst-inspect-1.0獲取。

Instead of letting GStreamer choose which Pad to use when linking two elements, you may want to specify the Pads directly. You can do this by adding a dot plus the Pad name after the name of the element (it must be a named element). Learn the names of the Pads of an element by using the gst-inspect-1.0 tool.

This is useful, for example, when you want to retrieve找到 one particular stream out of a 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_00 ! matroskamux ! filesink location=sintel_video.mkv

這段程式碼會從網上拉流,包含音訊和視訊,我們只指定視訊pad,打包到新的容器,然後使用屬性location寫到本地檔案,如果這個地址可連線的話,bin目錄下回生成相應的視訊檔案。

This fetches a media file from the internet using souphttpsrc, which is in webm format (a special kind of Matroska container, see Basic tutorial 2: GStreamer concepts). We then open the container using matroskademux. This media contains both audio and video, so matroskademux will create two output Pads, named video_00 and audio_00. We link video_00 to a matroskamux element to re-pack the video stream into a new container, and finally link it to a filesink, which will write the stream into a file named "sintel_video.mkv" (the location property specifies the name of the file).

All in all, we took a webm file, stripped it of audio, and generated a new matroska file with the video. If we wanted to keep only the audio:

gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux name=d d.audio_00 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka

同上,但是音訊需要額外新增一個vorbisparse,以便獲取音訊的能力集。matroskamux本身可以獲取視訊的能力集,所以上邊沒有vorbisparse這個element。

The vorbisparse element is required to extract some information from the stream and put it in the Pad Caps, so the next element, matroskamux, knows how to deal with the stream. In the case of video this was not necessary, because matroskademux already extracted this information and added it to the Caps.

Note that in the above two examples no media has been decoded or played. We have just moved from one container to another (demultiplexing and re-multiplexing again).

Caps filters能力集過濾器

當一個src elem含有多個pad,一個sink elem相容所有src的pad這樣src就會選擇第一個pad來與sink建立連線,這樣就存在二義性(因為你不知道那個pad在前那個在後)

When an element has more than one output pad, it might happen that the link to the next element is ambiguous: the next element may have more than one compatible相容的 input pad, or its input pad may be compatible with the Pad Caps of all the output pads. In these cases GStreamer will link using the first pad that is available, which pretty much amounts to saying that GStreamer will choose one output pad at random.

Consider the following pipeline:

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

上邊這個例子,你就不知道test裡邊到底還是音訊資料還是視訊資料,可以通過制定pad或者能力集過濾來達到目的,具體詳見下例。

This is the same media file and demuxer as in the previous example. The input Pad Caps of filesink are ANY, meaning that it can accept any kind of media. Which one of the two output pads of matroskademux will be linked against the filesink? video_00 or audio_00? You cannot know.

You can remove this ambiguity, though, by using named pads, as in the previous sub-section, or by using 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

通過在兩個element之間加入cap條件,這樣會導致只有滿足條件的才能通過。

A Caps Filter behaves like a pass-through element which does nothing and only accepts media with the given Caps, effectively resolving the ambiguity. In this example, between matroskademux and matroskamux we added a video/x-vp8 Caps Filter to specify that we are interested in the output pad of matroskademux which can produce this kind of video.

使用gst-inspect-1.0可以查詢element可以接受和生成的pad。使用 gst-discoverer-1.0可以發現一個指定檔案有包含的cap。如果要檢視指定pipeline中element的cap,可以通過 gst-launch-1.0的-v屬性獲取。

To find out the Caps an element accepts and produces, use the gst-inspect-1.0 tool. To find out the Caps contained in a particular file, use the gst-discoverer-1.0 tool. To find out the Caps an element is producing for a particular具體的 pipeline, run gst-launch-1.0 as usual, with the –v option to print Caps information.

Examples

執行結果如圖,完全有playbin建立pipelien及所需element

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

效果和上圖一致,重新對音視訊進行編碼,然後複合播放。

A fully operation playback pipeline, with audio and video (more or less the same pipeline that playbin will create internally):

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容器中儲存到檔案sintel.ogg中。

A transcoding pipeline, which opens the webm container and decodes both streams (via uridecodebin), then re-encodes the audio and video branches with a different codec, and puts them back together in an Ogg container (just for the sake of it).

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。

A rescaling pipeline. The videoscale element performs a rescaling operation whenever the frame size is different in the input and the output caps. The output caps are set by the Caps Filter to 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

簡單減少到此為止,複雜操作,詳見參考文件。

This short description of gst-launch-1.0 should be enough to get you started. Remember that you have the complete documentation available here.

gst-inspect-1.0檢查工具

這個工具有下邊功能,1,羅列所有可用element型別。2,查詢指定plugin的element。3,檢視指定element的所有資訊。

This tool has three modes of operation:

  • Without arguments, it lists all available elements types, this is, the types you can use to instantiate new elements.
  • With a file name as an argument, it treats the file as a GStreamer plugin, tries to open it, and lists all the elements described inside.
  • With a GStreamer element name as an argument, it lists all information regarding that element.

Let's see an example of the third mode:看下邊這個例子,輸入.\gst-inspect-1.0.exe vp8dec,檢視結果

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 <[email protected]>, Sebastian Dröge <[email protected]>

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 模板(這個element含有的所有pad,這裡sink pad模板僅支援video/x-vp8,src pad僅支援video/x-raw裸流,解碼後資料),element屬性(各種屬性,包括型別和可接受的屬性範圍)。

gst-inspect-1.0的更多內容,詳見gst-inspect-1.0.的幫助文件。

The most relevant sections are:

  • Pad Templates: This lists all the kinds of Pads this element can have, along with their capabilities. This is where you look to find out if an element can link with another one. In this case, it has only one sink pad template, accepting only video/x-vp8 (encoded video data in VP8 format) and only one source pad template, producing video/x-raw (decoded video data).
  • Element Properties: This lists the properties of the element, along with their type and accepted values.

For more information, you can check the documentation page of gst-inspect-1.0.

gst-discoverer-1.0

這個工具主要是對函式GstDiscoverer(詳見第9章)的包裝,接收一個URI,列印所有的media以及相關內容。使用gst-discoverer-1.0 --help可以獲得可用選項,用於控制輸出。

This tool is a wrapper包裝 around the GstDiscoverer object shown in Basic tutorial 9: Media information gathering. It accepts a URI from the command line and prints all information regarding the media that GStreamer can extract. It is useful to find out what container and codecs have been used to produce the media, and therefore what elements you need to put in a pipeline to play it.

Use gst-discoverer-1.0 --help to obtain the list of available options, which basically control the amount of verbosity嘮叨 of the output.

Let's see an example:

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

Conclusion

This tutorial has shown:

  • How to build and run GStreamer pipelines from the command line using the gst-launch-1.0 tool.
  • How to find out what GStreamer elements you have available and their capabilities, using the gst-inspect-1.0 tool.
  • How to discover the internal structure of media files, using gst-discoverer-1.0.

It has been a pleasure having you here, and see you soon!