介紹
這些工具就位於SDK的bin目錄下。你需要把這個目錄加入PATH變量,或者把當前目前目錄切換到GStreamer SDK的bin目錄。
為了防止多個版本的GStreamer都安裝導致的沖突,所有的工具都是有版本的,他們的名字后面跟着GStreamer的版本號。因為這個版本的SDK是1.0,所以工具就是gst-launch-1.0、gst-inspect-1.0和gst-discoverer-1.0。
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-1.0 videotestsrc ! videoconvert ! autovideosink
你可以看見一個帶動畫視頻窗口。使用CTRL+C可以終止運行。

這個例子用了videotestsrc,ffmpegcolorspace和autovideosink三個element。GStreamer會把他們的輸出pad和輸入pad連接起來,如果存在超過1個可用的輸入/輸出pad,那么就用pad的Caps來確定兼容的pad。
屬性
element可能是有屬性的,在命令行里格式就是“屬性=值”,多個屬性用空格來分開。可以用gst-inspect工具來查一下element的屬性(這個工具下面會講到)。
gst-launch-1.0 videotestsrc pattern=11 ! videoconvert ! autovideosink
你可以看見一個靜態的一系列同心圓的圖像。

帶名字的element
element可以用name這個屬性來設置名稱,這樣一些復雜的包含分支的pipeline可以創建了。有了名字,就可以使用前面創建的element,這在使用有多個pad的element(比如demuxer或者tee等)時是必不可少的。
帶名字的element在使用名字時需要在后面加一個點。
gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
你可以看見兩個視頻窗口,顯示同樣的內容。如果你只看到了一個,試着挪動一些窗口位置,可能另一個被壓住了。

這個例子中把videotestsrc先連接了ffmpegcolorspace,然后連接了tee element,這個tee就被命名成‘t’,然后一路輸出到queue以及autovideosink,另一路輸出到另一個queue和autovideosink。queue在這里是必須的。
Pads
在連接兩個element時與其讓GStreamer來選擇哪個Pad,我們寧可直接指定Pad。我們可以在命名element后使用.+pad名字的方法來做到這點(element必須先命名)。同樣可以用gst-inspect來查看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
這個命令使用souphttpsrc在internet上鎖定了一個媒體文件,這個文件是webm格式的。我們可以用matroskademux來打開這個文件,因為媒體包含音頻和視頻,所以我們創建了兩個輸出Pad,名字分別是video_00和audio_00。我們把video_00和matroskamux element連接起來,把視頻流重新打包,最后連接到filesink,這樣我們就把流存到了一個名叫sintel_video.mkv的文件。
總之,我們找了一個webm文件,去掉了聲音,僅把視頻拿出來存成了一個新文件。如果我們像保持聲音,那么就應該這樣做:
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 element會從流里面取出一些信息,然后放到Pad的Caps里面,這樣下一個element,也就是matroskamux就可以知道如何處理這個流了。這個處理在抓取視頻的時候是不用做的,因為matroskademux已經做了這件事情。
請注意,在上面的兩個例子中,媒體沒有被解碼和播放。我們僅僅只是把數據搬動了一下而已。
Caps過濾
當一個element有不止一個pad時,連接下一個element可能是模糊不清的,因為下游的element可能有不止一個的兼容的輸入pad,或者它的輸入pad可以和所有的輸出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
這里和上一個例子用了同樣的媒體文件和demuxer。finksink輸入pad是任意格式,這意味着它可以接受所有的媒體格式。那么matroskademux的哪個pad可以接到filesink呢?video_00還是audio_00?我們無法知道。
為了消除這種不確定性,前面例子中我們用了pad的名字的方法,這里介紹使用Caps過濾的方法:
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過濾動作類似於讓element不做任何動作,僅僅接受給出的Caps。在這個例子中,在matroskademux和matroskamux中間我們加入了一個ievideo/x-vp8的Caps過濾,這樣就表明在matroskademux中我們僅僅需要能生成這種類型視頻的輸出Pad。
我們需要用gst-inspect工具來查看一個element能接受和生成的Caps,用gst-discoverer來查看文件里面包含的Caps。如果我們需要查看在pipeline里面一個element生成的Caps,在gst-launch里面使用-v參數即可。
例子:
用playbin播放一個媒體文件
gst-launch-1.0 playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm
一個正常的播放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之后把所有的流解碼,重新把音視頻編碼成其他格式,然后壓成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。videoscale element可以調整輸入尺寸然后再輸出。例子里面用Caps過濾設置了視頻大小為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
get-launch簡單介紹大致就這些內容了,這可以作為一個很好的起點。
gst-inspect
這個工具有三種操作:
不帶參數,它會列出所有可用的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:這部分會列出所有的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-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