GStreamer系列 - 基本介紹

什麼是Gstreamer?

Gstreamer是一個支持Windows,Linux,Android, iOS的跨平臺的多媒體框架,應用程序能夠經過管道(Pipeline)的方式,將多媒體處理的各個步驟串聯起來,達到預期的效果。每一個步驟經過元素(Element)基於GObject對象系統經過插件(plugins)的方式實現,方便了各項功能的擴展。html

下圖是對基於Gstreamer框架的應用的簡單分層:ios

 

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層負責插件的加載及管理。主要分類爲:app

  • 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。tcp

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會根據指定的寬高產生相應數據:ide

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
本文版權歸做者全部,歡迎轉載。商業轉載請聯繫做者得到受權,非商業轉載請在文章頁面明顯位置給出原文鏈接.
相關文章
相關標籤/搜索