科普分享 | GStreamer是什麼?

背景 file 從歷史的角度來看,Linux 在多媒體方面已經遠遠落後於其它的操作系統。微軟的Windows和蘋果的MacOS它們對多媒體設備、多媒體創作、播放和實時處理等方面已經有了很好的支持。另一方面,Linux對多媒體應用的綜合貢獻比較少,這也使得Linux很難在專業級別的軟件上與Windows和MacOS去競爭。GStreamer正是爲解決Linux多媒體方面當前問題而設計的。

GStreamer是什麼? GStramer是一個創建流媒體應用程序的框架。GStreamer的程序開發框架使得編寫任意類型的流媒體應用程序成爲了可能。GStreamer並不受限於音頻和視頻處理它能夠處理任意類型的數據流。管道設計的方法對於實際應用的濾波器幾乎沒有負荷,它甚至可以用來設計出對延時有很高要求的高端音視頻應用程序。

GStreamer最顯著的用途是在構建一個播放器上, GStreamer已經支持很多格式的檔了,包括: MP3、Ogg/Vorbis. MPEG-12、 AVI、 Quickime、 mod等等。從這個角度看, GStreamer更像是一個播放器。但是它主要的優點卻是在於它的可插入組件能夠很方便的接入到任意的管道當中。

GStreamer框架是基於插件的,有些插件中提供了各種各樣的多媒體數字信號編譯碼器,也有些提供了其它的功能。所有的插件都能夠被鏈接到任意的已經定義了的數據流管道中。

GStreamer框架的應用的簡單分層: file

Media Applications

最上面一層爲應用,比如GStreamer自帶的一些工具(gst-launch,gst-inspect等),以及基於GStreamer封裝的庫(gst-player,gst-rtsp-server,gst-editing-services等)根據不同場景實現的應用。

Core Framework 中間一層爲Core Framework,主要提供:

  1. 上層應用所需接口

  2. Plugin的框架

  3. Pipline的框架

  4. 數據在各個Element間的傳輸及處理機制

  5. 多個媒體流(Streaming)間的同步(比如音視頻同步)

  6. 其他各種所需的工具庫

Plugins 最下層爲各種插件,實現具體的數據處理及音視頻輸出,應用不需要關注插件的細節,會由Core Framework層負責插件的加載及管理。主要分類爲:

1、Protocols:負責各種協議的處理,file,http,rtsp等。

2、Sources:負責數據源的處理,alsa,v4l2,tcp/udp等。

3、Formats:負責媒體容器的處理,avi,mp4,ogg等。

4、Codecs:負責媒體的編解碼,mp3,vorbis等。

5、Filters:負責媒體流的處理,converters,mixers,effects等。

6、Sinks:負責媒體流輸出到指定設備或目的地,alsa,xvideo,tcp/udp等。

7、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的優點

  1. 結構清晰且威力強大:我們可以使用一系列強有利的工具來創建媒體管道,而不用去寫一行代碼,從而使得複雜的媒體控制變得非常簡單。GStreamer 向插件提供了簡潔而簡單的API來創建self- plugin(自包含)插件,同時還集成了大量的調試和跟蹤機制和工具。GStreamer也提供了一系列現實例子。

  2. 靈活的可擴展性能:所有的GStreamer對象都可以採用GObject繼承的方法進行擴展。所有的插件都可以被動態裝載。

  3. 高性能主要體現在:使用GLib的g_ mem_ chunk和非模塊化分配算法使得內存分配儘可能最小。插件之間的連接非常輕型(light-weight).數據在管道中的傳遞使用最小的消耗,管道中插件之間的數據傳遞只會涉及指針廢棄。提供了一套對目標內存直接進行操作的機制。例如,插件可以向X server共享的內存空間直接寫數據,緩衝區也可以指向任意的內存,如聲卡的內部硬件緩衝區。refcounting和寫拷貝將memcpy減少到最低。子緩衝區有效地將緩衝區分離爲易於管理的塊。使用線程聯合(cothreads)減少線程消耗。線程聯合(cothreads)是簡單又高速的方法來切換子程序,作爲衡量最低消耗600個cpu週期的標準。使用特殊的插件從而支持硬件加速。採用帶有說明的插件註冊,這樣的話只在實際需要使用該插件纔會去裝載。所有的判斷數據都不用互斥鎖。

下一期我們會進一步學習GStreamer

  • End -

技術發展的日新月異,阿木實驗室將緊跟技術的腳步,不斷把機器人行業最新的技術和硬件推薦給大家。看到經過我們培訓的學員在技術上突飛猛進,是我們培訓最大的價值。如果你在機器人行業,就請關注我們的公衆號,我們將持續發佈機器人行業最有價值的信息和技術。 阿木實驗室致力於前沿IT科技的教育和智能裝備,讓機器人研發更高效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章