1. 程式人生 > >GStreamer基礎教程12 - 常用命令工具

GStreamer基礎教程12 - 常用命令工具

摘要

  GStreamer提供了不同的命令列工具用於快速的檢視資訊以及驗證Pipeline的是否能夠正確執行,在平時的開發過程中,我們也優先使用GStreamer的命令列工具驗證,再將Pipeline整合到應用中。本文將介紹gst-inspect-1.0,gst-discoverer-1.0,gst-launch-1.0命令列工具的使用。

 

gst-inspect-1.0

此命令有3種工作模式,實際中我們常用第一種和第三種方式:

  一、不帶任何引數。這樣會列出當前系統中支援的所有Element,這些Element可用於構造Pipeline.

  二、跟檔名。這樣會將指定檔案作為一個GStreamer外掛,嘗試列出其中所包含的Element。例如下面的命令列出了libgstjpeg.so所包含的2個Elements:

$ gst-inspect-1.0 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
Plugin Details:
  Name                     jpeg
  Description              JPeg plugin library
  Filename                 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
  Version                  1.8.3
  License                  LGPL
  Source module            gst-plugins-good
  Source release date      2016-08-19
  Binary package           GStreamer Good Plugins (Ubuntu)
  Origin URL               https://launchpad.net/distros/ubuntu/+source/gst-plugins-good1.0

  jpegenc: JPEG image encoder
  jpegdec: JPEG image decoder

  2 features:
  +-- 2 elements

 

  三、跟Element名。會列出Element的詳細資訊。例如,下面的命令會列出jpeg解碼器所支援的輸入資料型別,Pad資訊,支援的屬性及值。我們主要關注Pad Template,以及Element的屬性資訊。

$ gst-inspect-1.0 jpegdec
Factory Details:
  Rank                     primary (256)
  Long-name                JPEG image decoder
  Klass                    Codec/Decoder/Image
  Description              Decode images from JPEG format
  Author                   Wim Taymans <[email protected]>

Plugin Details:
  Name                     jpeg
  Description              JPeg plugin library
  Filename                 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
  Version                  1.8.3
  License                  LGPL
  Source module            gst-plugins-good
  Source release date      2016-08-19
  Binary package           GStreamer Good Plugins (Ubuntu)
  Origin URL               https://launchpad.net/distros/ubuntu/+source/gst-plugins-good1.0

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstVideoDecoder
                         +----GstJpegDec

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      image/jpeg

  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw
                 format: { I420, RGB, BGR, RGBx, xRGB, BGRx, xBGR, GRAY8 }
                  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 indexing capabilities.
Element has no URI handling capabilities.

Pads:
  SINK: 'sink'
    Implementation:
      Has chainfunc(): gst_video_decoder_chain
      Has custom eventfunc(): gst_video_decoder_sink_event
      Has custom queryfunc(): gst_video_decoder_sink_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'sink'
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_video_decoder_src_event
      Has custom queryfunc(): gst_video_decoder_src_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'src'

Element Properties:
  name                : The name of the object
                        flags: readable, writable
                        String. Default: "jpegdec0"
  parent              : The parent of the object
                        flags: readable, writable
                        Object of type "GstObject"
  idct-method         : The IDCT algorithm to use
                        flags: readable, writable
                        Enum "GstIDCTMethod" Default: 1, "ifast"
                           (0): islow            - Slow but accurate integer algorithm
                           (1): ifast            - Faster, less accurate integer method
                           (2): float            - Floating-point: accurate, fast on fast HW
  max-errors          : (Deprecated) Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error)
                        flags: readable, writable, 0x80000000
                        Integer. Range: -1 - 2147483647 Default: 0

 

gst-discoverer-1.0

  此命令在GStreamer基礎教程06 - 獲取媒體資訊中使用過,是對GstDiscoverer介面的封裝,可以方便的檢視媒體檔案的編碼,幀率等資訊。

$ gst-discoverer-1.0 sintel_trailer-480p.mp4
Analyzing file:///home/xleng/video/sintel_trailer-480p.mp4
Done discovering file:///home/xleng/video/sintel_trailer-480p.mp4

Topology:
  container: Quicktime
    audio: MPEG-4 AAC
    video: H.264 (High Profile)

Properties:
  Duration: 0:00:52.209000000
  Seekable: yes
  Live: no
  Tags:
      audio codec: MPEG-4 AAC audio
      maximum bitrate: 128000
      datetime: 1970-01-01T00:00:00Z
      title: Sintel Trailer
      artist: Durian Open Movie Team
      copyright: (c) copyright Blender Foundation | durian.blender.org
      description: Trailer for the Sintel open movie project
      encoder: Lavf52.62.0
      container format: ISO MP4/M4A
      video codec: H.264 / AVC
      bitrate: 535929

 

gst-launch-1.0

  gst-launch是我們平時使用最多的一個命令,它接收一個用字串方式描述的Pipline,將其例項化並執行。我們可以用此命令快速的檢查Pipeline中各個元素是否能夠正確的連線起來。當我們需要構建的Pipeline很複雜時,我們也可以將Pipeline進行拆分,逐步通過gst-launch驗證Pipeline的合法性。
  通過gst-launch驗證的字串Pipeline可以直接使用gst_parse_launch()介面將其轉化為GstPipeline物件,節省了我們單獨呼叫API去建立Element的時間。
  當我們用字串描述Pipeline時,每個Element之間需要通過歎號 “!" 分隔Element,這樣gst-launch才能正確識別。
  在使用gst-launch時,根據不同的應用場景,我們可以分為以下的型別。

採用預設的引數建立Pipeline

  這種方式我們只需將所使用的Element使用歎號分隔即可,例如:

$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

 

設定Element的屬性

  在某些情況下,我們需要修改Element的屬性,或指定所需引數(例如playbin的uri引數),Element的屬性直接跟在Element之後。下面的命令會設定videotestsrc的視訊模式,輸出影象為環形。屬性支援的值可以通過gst-inspect命令檢視。

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

  如果屬性值中包含空格,我們可以將其置於單引號或雙引號中。

$ gst-launch-1.0 -v videotestsrc ! clockoverlay halignment=right valignment=bottom text="Edge City" shaded-background=true font-desc="Sans, 36" ! videoconvert ! autovideosink

 

包含分支的Pipeline

  每個Element都有name的屬性,我們可以利用name來實現包含多個分支的複雜的Pipeline,這常見於有多個輸出/輸入的Element(mux,demux,tee等)。
  下面的命令通過tee建立了2個分支,分別用於不同的sink,在一個分支是Pipeline完成後(到達sink),我們可以使用“name加一個點號”重新建立一個分支。

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

  使用同樣的方式,我們也可以將多個分支合併為一個。下面的命令首先解碼檔案,將視訊編碼為H.264,音訊編碼為MP3,最終再合併生成TS檔案。注意dmux和mux Element的使用。

$ gst-launch-1.0 filesrc location=surround.mp4 ! decodebin name=dmux ! queue ! audioconvert ! lamemp3enc ! mux. \
dmux. ! queue ! x264enc ! mpegtsmux name=mux ! queue ! filesink location=out.ts

 

指定Element的Pad

  某些情況下,我們希望自己指定某個Pad用於連線,我們可以指定已命名Element的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_00 ! matroskamux ! filesink location=sintel_video.mkv

  上面的命令會將sintel_trailer-480p.webm檔案進行Demux,只選擇其中的視訊(video_00),再將其保留為mk檔案,只保留了視訊部分。如果想只保留音訊部分,可以使用如下命令:

$ 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

  上面兩條命令均未對視訊進行解碼,只是將其從一個容器中拷入到另一個容器。

 

利用Caps Filter過濾碼流

  當Element包含多個輸出Pad時,可能導致連線到下一個Element的Pad具有不確定性。在下一個Element支援當前Element所有的輸出型別,這時GStreamer會隨機選擇一個Pad用於連線。
  例如:我們無法確定下面的Pipeline會使用video_00還是audio_00連線到filesink,因為filesink同時支援audio及video輸入。

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

  我們可以如上一節所說,顯式指定連線所用的Pad,或者使用Caps Filter:

$ 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,並將資料傳遞到下一個Element,可以高效的解決二義性的問題。
  我們可以使用gst-inspect檢視Element的輸出Pad,以決定我們的Caps Filter需要新增何種引數。在gst-launch後加 -v 引數可以輸出Pipeline連線時所使用的Pad資訊。
  對於多個過濾條件,我們需要通過逗號隔開。

  對於某些特殊的型別引數,GStreamer提供了相應的關鍵字來進行轉換:

  • i 或 int 表示整型或範圍;
  • f 或 float 表示浮點數及範圍;
  • 4 或 fourcc 表示4個字元的FOURCC 程式碼;
  • b, bool, 或 boolean 表示布林型資料;
  • s, str, 或 string 表示字串;
  • fraction 表示分數(例如幀率, 畫素寬高比);
  • l 或 list 表示列表。

 

  用於傳送和接收UDP RTP資料:

$ gst-launch-1.0 v4l2src ! \
video/x-raw-yuv,width=128,height=96,format='(fourcc)'UYVY ! \
videoconvert ! ffenc_h263 ! video/x-h263 ! rtph263ppay pt=96 ! \
udpsink host=192.168.1.1 port=5000 sync=false

$gst-launch-1.0 udpsrc port=5000 ! application/x-rtp, \
clock-rate=90000,payload=96 ! rtph263pdepay queue-delay=0 ! ffdec_h263 \
! xvimagesink

 

  使用YUY2或YV12作為測試視訊格式,幀率為30幀/秒:

$ gst-launch-1.0 videotestsrc ! \
'video/x-raw-yuv,format=(fourcc)YUY2,framerate=30/1;video/x-raw-yuv,format=(fourcc)YV12,framerate=30/1' \
! xvimagesink

  

  通過alsasrc錄製檔案,限定取樣率及位寬:

$ gst-launch-1.0 alsasrc! \
'audio/x-raw-int,rate=[32000,64000],width=[16,32],depth={16,24,32},signed=(boolean)true' \
! wavenc ! filesink location=recording.wav

   

總結

  通過本文,我們掌握了:

  • 如何通過gst-inspect-1.0檢視當前系統所擁有的GStreamer外掛以及每個外掛的詳細資訊。
  • 如何通過gst-discoverer-1.0檢視媒體檔案的Metadata。
  • 如何通過gst-launch-1.0執行及測試Pipeline。
  • 如果通過Caps Filter過濾指定資料。

 

引用

https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/tutorials/basic/gstreamer-tools.html?gi-language=c

 

 

作者:John.Leng 出處:http://www.cnblogs.com/xleng/ 本文版權歸作者所有,歡迎轉載。商業轉載請聯絡作者獲得授權,非商業轉載請在文章頁面明顯位置給出原文連線.