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
本文版權歸作者所有,歡迎轉載。商業轉載請聯系作者獲得授權,非商業轉載請在文章頁面明顯位置給出原文連接.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM