GStreamer基礎教程10——GStreamer工具

本文轉自:https://blog.csdn.net/sakulafly/article/details/21455637

目標

      GStreamer提供了一系列方便使用的工具。這篇教程裏不牽涉任何代碼,但還是會講一些有用的內容:

      如何在命令行下建立一個pipeline——完全不使用C

      如何找出一個element的Capabilities

      如何發現一個媒體文件的內部結構

 

介紹

      這些工具就位於SDK的bin目錄下。你需要把這個目錄加入PATH變量,或者把當前目前切換到GStreamer SDK的bin目錄。

      打開一個終端界面,把當前目錄切換到GStreamer SDK的bin目錄,然後準備跟着我們操作吧。

      爲了防止多個版本的GStreamer都安裝導致的衝突,所有的工具都是有版本的,他們的名字後面跟着GStreamer的版本號。因爲這個版本的SDK是0.10,所以工具就是gst-launch-0.10、gst-inspect-0.10和gst-discoverer-0.10。

 

gst-launch

      這個工具可以創建一個pipeline,初始化然後運行。它可以讓你在正式寫代碼實現pipeline之前先快速測試一下,看看是否能工作。

      請記住這個工具只能建立簡單地pipeline。尤其是,它只能在一個特定層級之上模擬pipeline和應用的交互。在任何情況下,它都可以很簡單的快速測試pipeline,全世界的GStreamer的開發者每天都在使用它。

      請注意,gst-launch對於開發者來說主要是一個調試工具。你不應該基於它開發應用,而應該使用gst_parse_launch()這個API來創建pipeline。

      雖然構造pipeline的描述是非常簡單地事情,但多個element的連接也很快能讓事情變得超越你的想象。不過別怕,最後每個人都能學會gst-launch的語法。

      gst-launch的命令行包括一個在PIPELINE-DESCRIPTION之後的一系列選項。有些簡單地指令在下面會講到,在gst-launch的描述文檔上可以看到所有的相關內容。

elements

      簡單來說,一個PIPELINE-DESCRPTION是一系列用!分隔開的元素,試一下下面的命令:

 

gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink

      你可以看見一個帶動畫視頻窗口。使用CTRL+C可以終止運行。

 

      這個例子用了videotestsrc,ffmpegcolorspace和autovideosink三個element。GStreamer會把他們的輸出pad和輸入pad連接起來,如果存在超過1個可用的輸入/輸出pad,那麼就用pad的Caps來確定兼容的pad。

屬性

      element可能是有屬性的,在命令行裏格式就是“屬性=值”,多個屬性用空格來分開。可以用gst-inspect工具來查一下element的屬性(這個工具下面會講到)。

 

gst-launch-0.10 videotestsrc pattern=11 ! ffmpegcolorspace ! autovideosink

      你可以看見一個靜態的一系列同心圓的圖像。

 

帶名字的element

      element可以用name這個屬性來設置名稱,這樣一些複雜的包含分支的pipeline可以創建了。有了名字,就可以使用前面創建的element,這在使用有多個pad的element(比如demuxer或者tee等)時是必不可少的。

      帶名字的element在使用名字時需要在後面加一個點。

 

gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink

      你可以看見兩個視頻窗口,顯示同樣的內容。如果你只看到了一個,試着挪動一些窗口位置,可能另一個被壓住了。

 

      這個例子中把videotestsrc先連接了ffmpegcolorspace,然後連接了tee element(在《GStreamer基礎教程07——多線程和pad的有效性》裏提到過),這個tee就被命名成‘t’,然後一路輸出到queue以及autovideosink,另一路輸出到另一個queue和autovideosink。

      queue在這裏是必須的,原因參見《GStreamer基礎教程07——多線程和pad的有效性》。

Pads

      在連接兩個element時與其讓GStreamer來選擇哪個Pad,我們寧可直接指定Pad。我們可以在命名element後使用.+pad名字的方法來做到這點(element必須先命名)。同樣可以用gst-inspect來查看element裏面pad的名字。

 

gst-launch-0.10.exe souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d d.video_00 ! matroskamux ! filesink location=sintel_video.mkv

      這個命令使用souphttpsrc在internet上鎖定了一個媒體文件,這個文件是webm格式的。我們可以用matroskademux來打開這個文件,因爲媒體包含音頻和視頻,所以我們創建了兩個輸出Pad,名字分別是video_00和audio_00。我們把video_00和matroskamux element連接起來,把視頻流重新打包,最後連接到filesink,這樣我們就把流存到了一個名叫sintel_video.mkv的文件。

 

      總之,我們找了一個webm文件,去掉了聲音,僅把視頻拿出來存成了一個新文件。如果我們像保持聲音,那麼就應該這樣做:

 

gst-launch-0.10.exe souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d d.audio_00 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka

      這裏的vorbisparse element會從流裏面取出一些信息,然後放到Pad的Caps裏面,這樣下一個element,也就是matroskamux就可以知道如何處理這個流了。這個處理在抓取視頻的時候是不用做的,因爲matroskademux已經做了這件事情。

 

      請注意,在上面的兩個例子中,媒體沒有被解碼和播放。我們僅僅只是把數據搬動了一下而已。

Caps過濾

      當一個element有不止一個pad時,連接下一個element可能是模糊不清的,因爲下游的element可能有不止一個的兼容的輸入pad,或者它的輸入pad可以和所有的輸出pad兼容。在這樣的情況下,GStreamer會使用第一個可以連接的Pad,這樣相當於說GStreamer是隨機找一個pad來連接的。

      看一下下面的pipeline:

 

gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test

 

      這裏和上一個例子用了同樣的媒體文件和demuxer。finksink輸入pad是任意格式,這意味着它可以接受所有的媒體格式。那麼matroskademux的哪個pad可以接到filesink呢?video_00還是audio_00?我們無法知道。

      爲了消除這種不確定性,前面例子中我們用了pad的名字的方法,這裏介紹使用Caps過濾的方法:

 

gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux ! video/x-vp8 ! matroskamux ! filesink location=sintel_video.mkv

      一個Caps過濾動作類似於讓element不做任何動作,僅僅接受給出的Caps。在這個例子中,在matroskademux和matroskamux中間我們加入了一個ievideo/x-vp8的Caps過濾,這樣就表明在matroskademux中我們僅僅需要能生成這種類型視頻的輸出Pad。

 

      我們需要用gst-inspect工具來查看一個element能接受和生成的Caps,用gst-discoverer來查看文件裏面包含的Caps。如果我們需要查看在pipeline裏面一個element生成的Caps,在gst-launch裏面使用-v參數即可。

例子

      用playbin2播放一個媒體文件(和《GStreamer基礎教程01——Hello World》一樣)

 

gst-launch-0.10 playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm

      一個正常的播放pipeline。

 

 

gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d ! queue ! vp8dec ! ffmpegcolorspace ! autovideosink d. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink

 

      一個轉碼的pipeline,解析webm之後把所有的流解碼,重新把音視頻編碼成其他格式,然後壓成Ogg文件。

 

gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm name=d ! queue ! theoraenc ! oggmux name=m ! filesink location=sintel.ogg d. ! queue ! audioconvert ! audioresample ! flacenc ! m.

 

      一個調整視頻比例的pipeline。videoscale element可以調整輸入尺寸然後再輸出。例子裏面用Caps過濾設置了視頻大小爲320x200:

 

gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! queue ! videoscale ! video/x-raw-yuv,width=320,height=200 ! ffmpegcolorspace ! autovideosink

 

      get-launch簡單介紹大致就這些內容了,這可以作爲一個很好的起點。如果你需要更多的信息,請猛戳這裏

 

gst-inspect

      這個工具有三種操作:

      不帶參數,它會列出所有可用的element,也就是你所有可以使用的元素

      帶一個文件名,它會把這個文件作爲GStreamer的一個插件,試着打開,然後列出內部所有的element

      帶一個GStreamer的element,會列出該element的所有信息

      讓我們看一個例子:

gst-inspect-0.10 vp8dec
 
Factory Details:
  Long name:    On2 VP8 Decoder
  Class:        Codec/Decoder/Video
  Description:  Decode VP8 video streams
  Author(s):    David Schleef <[email protected]>
  Rank:         primary (256)
Plugin Details:
  Name:                 vp8
  Description:          VP8 plugin
  Filename:             I:\gstreamer-sdk\2012.5\x86\lib\gstreamer-0.10\libgstvp8.dll
  Version:              0.10.23
  License:              LGPL
  Source module:        gst-plugins-bad
  Source release date:  2012-02-20
  Binary package:       GStreamer Bad Plug-ins (GStreamer SDK)
  Origin URL:           http://www.gstreamer.com
GObject
 +----GstObject
       +----GstElement
             +----GstBaseVideoCodec
                   +----GstBaseVideoDecoder
                         +----GstVP8Dec
Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw-yuv
                 format: I420
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-vp8
 
Element Flags:
  no flags set
Element Implementation:
  Has change_state() function: gst_base_video_decoder_change_state
  Has custom save_thyself() function: gst_element_save_thyself
  Has custom restore_thyself() function: gst_element_restore_thyself
Element has no clocking capabilities.
Element has no indexing capabilities.
Element has no URI handling capabilities.
Pads:
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_base_video_decoder_src_event
      Has custom queryfunc(): gst_base_video_decoder_src_query
        Provides query types:
                (1):    position (Current position)
                (2):    duration (Total duration)
                (8):    convert (Converting between formats)
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
      Has getcapsfunc(): gst_pad_get_fixed_caps_func
      Has acceptcapsfunc(): gst_pad_acceptcaps_default
    Pad Template: 'src'
  SINK: 'sink'
    Implementation:
      Has chainfunc(): gst_base_video_decoder_chain
      Has custom eventfunc(): gst_base_video_decoder_sink_event
      Has custom queryfunc(): gst_base_video_decoder_sink_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
      Has setcapsfunc(): gst_base_video_decoder_sink_setcaps
      Has acceptcapsfunc(): gst_pad_acceptcaps_default
    Pad Template: 'sink'
Element Properties:
  name                : The name of the object
                        flags: readable, writable
                        String. Default: "vp8dec0"
  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: 0x00000003, "demacroblock+deblock"
                           (0x00000001): deblock          - Deblock
                           (0x00000002): demacroblock     - Demacroblock
                           (0x00000004): addnoise         - Add noise
  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  

這裏最重要的是 :

 

      Pad Templates:這部分會列出所有的Pad的種類以及它們的Caps。通過這些你可以確認是否可以和某一個element連接。這個例子中,只有一個sink的Pad Template,只能接受video/x-vp8(用VP8格式來編碼視頻數據)格式;只有一個source的Pad Template,生成video/x-raw-yuv。

      element的屬性:這裏列出了element的所有的屬性以及有效值。

      更多信息請查看gst-inspect的文檔。

 

gst-discoverer

      這個工具是對GstDiscoverer對象的一個包裝。它可以接受從命令行輸入的一個URI,然後打印出所有的信息。這個在查看媒體是如何編碼如何複用時是很有用的,這樣我們可以確定把什麼element放到pipeline裏面。

      使用gst-discoverer --help來獲得幫助。

      讓我們看個例子:

gst-discoverer-0.10 http://docs.gstreamer.com/media/sintel_trailer-480p.webm -v
 
Analyzing http://docs.gstreamer.com/media/sintel_trailer-480p.webm
Done discovering http://docs.gstreamer.com/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: On2 VP8
      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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章