GStreamer提供了不一樣的命令行工具用於快速的查看信息以及驗證Pipeline的是否可以正確運行,在平時的開發過程當中,咱們也優先使用GStreamer的命令行工具驗證,再將Pipeline集成到應用中。本文將介紹gst-inspect-1.0,gst-discoverer-1.0,gst-launch-1.0命令行工具的使用。html
此命令有3種工做模式,實際中咱們經常使用第一種和第三種方式:linux
1、不帶任何參數。這樣會列出當前系統中支持的全部Element,這些Element可用於構造Pipeline.web
2、跟文件名。這樣會將指定文件做爲一個GStreamer插件,嘗試列出其中所包含的Element。例以下面的命令列出了libgstjpeg.so所包含的2個Elements:ubuntu
$ 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
3、跟Element名。會列出Element的詳細信息。例如,下面的命令會列出jpeg解碼器所支持的輸入數據類型,Pad信息,支持的屬性及值。咱們主要關注Pad Template,以及Element的屬性信息。vim
$ 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 <wim@fluendo.com> 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
此命令在GStreamer基礎教程06 - 獲取媒體信息中使用過,是對GstDiscoverer接口的封裝,能夠方便的查看媒體文件的編碼,幀率等信息。app
$ 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是咱們平時使用最多的一個命令,它接收一個用字符串方式描述的Pipline,將其實例化並運行。咱們能夠用此命令快速的檢查Pipeline中各個元素是否可以正確的鏈接起來。當咱們須要構建的Pipeline很複雜時,咱們也能夠將Pipeline進行拆分,逐步經過gst-launch驗證Pipeline的合法性。
經過gst-launch驗證的字符串Pipeline能夠直接使用gst_parse_launch()接口將其轉化爲GstPipeline對象,節省了咱們單獨調用API去建立Element的時間。
當咱們用字符串描述Pipeline時,每一個Element之間須要經過歎號 「!" 分隔Element,這樣gst-launch才能正確識別。
在使用gst-launch時,根據不一樣的應用場景,咱們能夠分爲如下的類型。less
這種方式咱們只需將所使用的Element使用歎號分隔便可,例如:ide
$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
在某些狀況下,咱們須要修改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
每一個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
某些狀況下,咱們但願本身指定某個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
上面兩條命令均未對視頻進行解碼,只是將其從一個容器中拷入到另外一個容器。
當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提供了相應的關鍵字來進行轉換:
用於發送和接收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
經過本文,咱們掌握了:
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
原文出處:https://www.cnblogs.com/xleng/p/11791944.html