本文轉自: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