本文轉自:https://blog.csdn.net/sakulafly/article/details/21748777
參考博客:https://blog.csdn.net/sakulafly/article/details/21318313
目標
本教程給出了一系列開發中常用的element。它們包括大雜燴般的eleemnt(比如playbin2)以及一些調試時很有用的element。
簡單來說,下面用gst-launch這個工具給出一個個具體例子(命令行),你可以用-v參數可以看到Pad得Caps是如何協商的。
Bins
這些是Bin element,它們在內部包含其他的element,已經組成了內部的pipeline,但在外部,我們還是把它們當成一個element。
Playbin2
這個element在整個系列的教程裏面廣泛的被使用了。它會處理播放的方方面面,從源經過解複用、解碼到最後的顯示。同時它也非常靈活,有很多設置項,在後面有教程會更詳細的講述到。
uridecodebin
這個element從一個URI獲得數據然後解碼成原始媒體數據。它會選擇一個能處理給定的URI的source element,然後和decodebin2連接起來。它在一個媒體裏面發現多少流就提供多少source pad來輸出,這點和解複用很像。
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! ffmpegcolorspace ! autovideosink
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink
decodebin2
這個element會自動用解複用插件和解碼插件創建解碼pipeline。它被使用起來更方便的uridecodebin作爲一個source element集成在自己內部了。以前還有一箇舊的decodebin,目前已經廢棄不用了。和uridecodebin一樣,它也是在媒體裏面發現多少流就提供多少source pad來輸出。
gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink
文件輸入/輸出
filesrc
這個element會讀取一個本地文件然後用Caps來輸出媒體數據。如果你想要獲得一個正確地Caps,那麼需要用typefind element來搜索流或者把filesrc的typefind屬性設置成TRUE。
gst-launch-0.10 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin2 ! autovideosink
filesink
這個element會把所有收到的媒體數據存成文件。使用location屬性來指定路徑和文件名。
gst-launch-0.10 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg
Network
souphttpsrc
這個element作爲一個客戶端,使用SOUP庫經由HTTP來接收數據。通過location屬性來設置URL。
gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink
測試媒體數據生成
這些element在測試pipeline是否工作時是非常有用的,它們是確保可以工作生成數據的,所以可以取代數據源。
videotestsrc
這個element生成一個固定的video輸出(通過pattern屬性來設置),用來測試視頻的pipeline。
gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink
audiotestsrc
這個element生成一個音頻信號(通過設置wave屬性來設置),用來測試音頻的pipeline。
gst-launch-0.10 audiotestsrc ! audioconvert ! autoaudiosink
視頻適配
ffmpegcolorspace
這個element會把一個色彩空間轉換到另一個色彩空間(比如從RGB轉到YUV)。它也可以在轉換不同的YUV格式或者RGB格式。
通常來說,在解決協商問題時,這個element是你的第一選擇。當上遊element和下游element是兼容的時候,這個element就是直通的,所以對性能的影響幾乎是不存在的。
作爲一個習慣,當你用一個不知道Caps的element的時候,總是可以用一下ffmpegcolorspace,就像autovideosink一樣。
st-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink
videorate
這個element接受帶時間戳的視頻數據轉換成匹配source pad幀率的流。通過丟棄或者複製幀來執行改正,而不是通過古怪的算法。
這個在連接不同幀率的element時很有用。正如其他的適配插件,如果不需要的話會直通過去(上下游element能匹配上)。
如果實際幀率未知的情況下,爲了以防萬一,使用這個element是個不錯的主意。
gst-launch-0.10 videotestsrc ! video/x-raw-rgb,framerate=30/1 ! videorate ! video/x-raw-rgb,framerate=1/1 ! ffmpegcolorspace ! autovideosink
videoscale
這個element可以修改視頻幀的尺寸。這個element會先檢查不修改視頻尺寸是否可行,如果可行,就不在進行尺寸的轉換。所以在pipeline中加入這個element是安全的,可以提高魯棒性。
這個element支持很多色彩空間,包括不同的YUV和RGB格式。而且可以放在pipeline的任何地方。
如果視頻是往一個用戶控制的窗口輸出時,加上videoscale這個element是個好主意,因爲並不是所有的視頻輸出都是支持縮放的。
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw-yuv,width=178,height=100 ! ffmpegcolorspace ! autovideosink
音頻適配
audioconvert
這個element會轉化原始的不同音頻格式之間的緩衝。它支持從整數到浮點數的轉化,符號數/字節序轉換以及聲道轉換。
正如ffmpegcolorspace對於視頻做的一樣,這個element使用很安全,你可以用來解決音頻不匹配的問題。
gst-launch-0.10 audiotestsrc ! audioconvert ! autoaudiosink
audioresample
這個element使用可配置的窗口函數重採樣音頻緩衝到不同的採樣率來增強質量。
同樣地,它可以解決採樣率的問題,同時不需要擔心出錯。
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioresample ! audio/x-raw-float,rate=4000 ! audioconvert ! autoaudiosink
audiorate
這個element接受帶時間戳的音頻幀,然後通過增加或者降低採樣來獲得一個標準流。它不能修改採樣率,只能通過移除重疊部分和填充空白部分來獲得連續“乾淨”的輸出。
當時間戳丟失接收器要求所有的採樣同時渲染時這個element比較有用。這個很難給出一個例子,所以就省略了。
多線程
queue
queue已經在《GStreamer基礎教程07——多線程和Pad的有效性》裏面介紹過了。基本上,一個queue執行兩個任務:
數據可以一直放進隊列直到滿爲止
queue會給source pad創建一個新的線程,這樣就可以解耦對於sink和source pad的處理
另外,queue在變空或滿的時候會觸發信號,可以拋棄一些緩衝數據來避免阻塞。
如果你不面臨網絡緩衝的困境,那麼使用更簡單的queue element而不是queue2,具體例子同樣參考《GStreamer基礎教程07——多線程和Pad的有效性》
queue2
這個element不是queue的進化版本。它和queue有同樣地設計目標,但實現方法不同,這也導致了一些功能不太一致。不幸的是,通常來說很難說孰優孰劣。
queue2同樣執行了上面列出的queue的兩個任務,此外,還可以把收到的數據存在硬盤上。它同時用更通用更方便的緩衝消息來取代了空/滿這些信號,這個緩衝消息在《GStreamer基礎教程12——流》裏面描述過了。
當涉及到網絡緩衝時,請使用queue2而不是queue。請參考《GStreamer基礎教程12——流》。
multiqueue
這個element可以對多個流同時提供queue,並且簡化對流的管理。此外,它可以同步不同的流,確保任何一個流都不會運行的特別快。
這是一個先進的element。decodebin2裏面包含着這個element,你在一個通常的播放應用裏面很少會直接使用。
tee
在《GStreamer基礎教程07——多線程和Pad的有效性》這篇裏面,我們已經演示瞭如何使用tee這個element。把數據分成相同的多份是非常有用的,比如,可以同時在屏幕上播放圖像和保存文件到硬盤。
在每個分支上使用獨立的playbin2 element,提供相互獨立的線程。否則一旦數據在一個分支上阻塞了,那麼其它分支也會停止。
gst-launch-0.10 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! ffmpegcolorspace ! autovideosink
能力
capsfilter
在《GStreamer基礎教程10——GStreamer工具》裏面已經解釋了gst-launch怎麼使用Caps過濾。當我們編程實現一個pipeline時,Caps過濾通常用capsfilter這個element來實現。這個element不會修改數據,但會限制數據的類型。
gst-launch-0.10 videotestsrc ! video/x-raw-gray ! ffmpegcolorspace ! autovideosink
typefind
這個element決定了一個流所包含的媒體的類型。它按照他們的等級調用typefind函數。一旦檢測到,它就會把source pad設置成發現的媒體類型,然後發出have-type信號。
decodebin2這個element內部就包含了typefind,雖然我們通常是使用GstDiscoverer來獲得更多地信息,但你也可以用這個element來確定媒體類型。
調試
fakesink
這個sink element僅僅簡單的拋棄所有輸入的數據。在調試過程中它是很有用的,你可以用它來取代你想使用的sink來確保不會出現意外。它在gst-lauch命令行並出現-v參數後會顯得非常冗餘,如果你覺得無用信息太多,那麼可以設置silent屬性。
gst-launch-0.10 audiotestsrc num-buffers=1000 ! fakesink sync=false
identity
這是一個啞巴element僅僅把輸入數據不加修改的傳過來。它也有一些有用的調試函數,例如偏移量和時間戳檢測,或者丟棄緩衝。想要進一步瞭解請閱讀它的文檔。
gst-launch-0.10 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink