GStreamer系列 - 基本介紹
什麼是Gstreamer?
Gstreamer是一個支援Windows,Linux,Android, iOS的跨平臺的多媒體框架,應用程式可以通過管道(Pipeline)的方式,將多媒體處理的各個步驟串聯起來,達到預期的效果。每個步驟通過元素(Element)基於GObject物件系統通過外掛(plugins)的方式實現,方便了各項功能的擴充套件。
下圖是對基於Gstreamer框架的應用的簡單分層:
Media Applications
最上面一層為應用,比如gstreamer自帶的一些工具(gst-launch,gst-inspect等),以及基於gstreamer封裝的庫(gst-player,gst-rtsp-server,gst-editing-services等)根據不同場景實現的應用。
Core Framework
中間一層為Core Framework,主要提供:
- 上層應用所需介面
- Plugin的框架
- Pipline的框架
- 資料在各個Element間的傳輸及處理機制
- 多個媒體流(Streaming)間的同步(比如音視訊同步)
- 其他各種所需的工具庫
Plugins
最下層為各種外掛,實現具體的資料處理及音視訊輸出,應用不需要關注外掛的細節,會由Core Framework層負責外掛的載入及管理。主要分類為:
- Protocols:負責各種協議的處理,file,http,rtsp等。
- Sources:負責資料來源的處理,alsa,v4l2,tcp/udp等。
- Formats:負責媒體容器的處理,avi,mp4,ogg等。
- Codecs:負責媒體的編解碼,mp3,vorbis等。
- Filters:負責媒體流的處理,converters,mixers,effects等。
- Sinks:負責媒體流輸出到指定裝置或目的地,alsa,xvideo,tcp/udp等。
Gstreamer框架根據各個模組的成熟度以及所使用的開源協議,將core及plugins置於不同的原始碼包中:
- gstreamer: 包含core framework及core elements。
- gst-plugins-base: gstreamer應用所需的必要外掛。
- gst-plugins-good: 高質量的採用LGPL授權的外掛。
- gst-plugins-ugly: 高質量,但使用了GPL等其他授權方式的庫的外掛,比如使用GPL的x264,x265。
- gst-plugins-bad: 質量有待提高的外掛,成熟後可以移到good外掛列表中。
- gst-libav: 對libav封裝,使其能在gstreamer框架中使用。
Gstreamer基礎概念
在進一步學習Gstreamer前,我們需要掌握一些gstreamer的基礎概念。
Element
Element是Gstreamer中最重要的物件型別之一。一個element實現一個功能(讀取檔案,解碼,輸出等),程式需要建立多個element,並按順序將其串連起來,構成一個完整的pipeline。
Pad
Pad是一個element的輸入/輸出介面,分為src pad(生產資料)和sink pad(消費資料)兩種。
兩個element必須通過pad才能連線起來,pad擁有當前element能處理資料型別的能力(capabilities),會在連線時通過比較src pad和sink pad中所支援的能力,來選擇最恰當的資料型別用於傳輸,如果element不支援,程式會直接退出。在element通過pad連線成功後,資料會從上一個element的src pad傳到下一個element的sink pad然後進行處理。
當element支援多種資料處理能力時,我們可以通過Cap來指定資料型別.
例如,下面的命令通過Cap指定了視訊的寬高,videotestsrc會根據指定的寬高產生相應資料:
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink
Bin和Pipeline
Bin是一個容器,用於管理多個element,改變bin的狀態時,bin會自動去修改所包含的element的狀態,也會轉發所收到的訊息。如果沒有bin,我們需要依次操作我們所使用的element。通過bin降低了應用的複雜度。
Pipeline繼承自bin,為程式提供一個bus用於傳輸訊息,並且對所有子element進行同步。當將pipeline的狀態設定為PLAYING時,pipeline會在一個/多個新的執行緒中通過element處理資料。
下面我們通過一個檔案播放的例子來熟悉上述提及的概念:測試檔案sintel_trailer-480p.ogv
gst-launch-1.0 filesrc location=sintel_trailer-480p.ogv ! oggdemux name=demux ! queue ! vorbisdec ! autoaudiosink demux. ! queue ! theoradec ! videoconvert ! autovideosink
通過上面的命令播放檔案時,會建立如下pipeline:
可以看到這個pipeline由8個element構成,每個element都實現各自的功能:
filesrc讀取檔案,oggdemux解析檔案,分別提取audio,video資料,queue快取資料,vorbisdec解碼audio,autoaudiosink自動選擇音訊裝置並輸出,theoradec解碼video,videoconvert轉換video資料格式,autovideosink自動選擇顯示裝置並輸出。
不同的element擁有不同數量及型別的pad,只有src pad的element被稱為source element,只有sink pad的被稱為sink element。
element可以同時擁有多個相同的pad,例如oggdemux在解析檔案後,會將audio,video通過不同的pad輸出。
Gstreamer資料訊息互動
在pipeline執行的過程中,各個element以及應用之間不可避免的需要進行資料訊息的傳輸,gstreamer提供了bus系統以及多種資料型別(Buffers、Events、Messages,Queries)來達到此目的:
Bus
Bus是gstreamer內部用於將訊息從內部不同的streaming執行緒,傳遞到bus執行緒,再由bus所線上程將訊息傳送到應用程式。應用程式只需要向bus註冊訊息處理函式,即可接收到pipline中各element所發出的訊息,使用bus後,應用程式就不用關心訊息是從哪一個執行緒發出的,避免了處理多個執行緒同時發出訊息的複雜性。
Buffers
用於從sources到sinks的媒體資料傳輸。
Events
用於element之間或者應用到element之間的資訊傳遞,比如播放時的seek操作是通過event實現的。
Messages
是由element發出的訊息,通過bus,以非同步的方式被應用程式處理。通常用於傳遞errors, tags, state changes, buffering state, redirects等訊息。訊息處理是執行緒安全的。由於大部分訊息是通過非同步方式處理,所以會在應用程式裡存在一點延遲,如果要及時的相應訊息,需要在streaming執行緒捕獲處理。
Queries
用於應用程式向gstreamer查詢總時間,當前時間,檔案大小等資訊。
gstreamer tools
Gstreamer自帶了gst-inspect-1.0和gst-launch-1.0等其他命令列工具,我們可以使用這些工具完成常見的處理任務。
gst-inspect-1.0
檢視gstreamer的plugin、element的資訊。直接將plugin/element的型別作為引數,會列出其詳細資訊。如果不跟任何引數,會列出當前系統gstreamer所能查詢到的所有外掛。
$ gst-inspect-1.0 playbin
gst-launch-1.0
用於建立及執行一個Pipline,因此通常使用gst-launch先驗證相關功能,然後再編寫相應應用。
通過上面ogg視訊播放的例子,我們已經看到,一個pipeline的多個element之間通過 “!" 分隔,同時可以設定element及Cap的屬性。例如:
播放音視訊
gst-launch-1.0 playbin file:///home/root/test.mp4
轉碼
gst-launch-1.0 filesrc location=/videos/sintel_trailer-480p.ogv ! decodebin name=decode ! \ videoscale ! "video/x-raw,width=320,height=240" ! x264enc ! queue ! \ mp4mux name=mux ! filesink location=320x240.mp4 decode. ! audioconvert ! \ avenc_aac ! queue ! mux.
Streaming
#Server gst-launch-1.0 -v videotestsrc ! "video/x-raw,framerate=30/1" ! x264enc key-int-max=30 ! rtph264pay ! udpsink host=127.0.0.1 port=1234 #Client gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false
引用
https://gstreamer.freedesktop.org/documentation/application-development/introduction/gstreamer.html
https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html
https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html
作者:John.Leng
出處:http://www.cnblogs.com/xleng/
本文版權歸作者所有,歡迎轉載。商業轉載請聯絡作者獲得授權,非商業轉載請在文章頁面明顯位置給出原文連線.