GStreamer基礎教程14——常用的element

本文轉自: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章