天天看點

Gstreamer 設計理念 —— 【初探】

概述

接觸Gstreamer有一段時間了,看完了官網的教程,可能由于對英文單詞釋義了解不當,導緻對Gstreamer中的很多概念并不是很清楚。感覺都是懵懵懂懂的知道點,但真要說,又說不出是以然。于是筆者想不再僅停留在

gst-launch

階段,是時候去閱讀Gstreamer的源碼了,畢竟源碼就是最好的文檔。

願景

我希望能寫一套完整的教程。詳細記錄自己一點點啃Gstreamer源碼的過程。但我也不清楚自己時間和精力是否允許(通俗來說就是擔心自己會知難而退…),暫且先保持精力滿滿的去看待這個問題。是以先給出我目前預計的學習計劃:

  1. 淺談自己了解的Gstreamer設計理念(正是本篇)
  2. filesrc element 代碼解析

    2.1 pad協商

    2.2 記憶體配置設定器協商

    2.3 資料的傳送

    2.4 關閉

  3. basesrc element 代碼解析
  4. filesink element 代碼解析
  5. basesink element 代碼解析
  6. Gstreamer基礎元素解析(gstelement、bus等)
  7. bin原件解析(揭開各個元素的連接配接,和資料流通過程)

    從2 ~ 5均将目光放到功能性的element上,6 ~ 7則傾向描述管道的構成,以及管道如何把各個element串聯,資料如何開始流通。

淺談自己的了解

Gstreamer基于Gobject,我們使用gst-launch時用到的一個個element其實就是一個類(本文中的類引申為Gobject的類和對象),這個類提供了完成具體功能的方法。但這些方法在建立執行個體後,絕大多數使用者都不必直接使用這些執行個體的方法。這是為什麼呢?答案就在Gstreamer提出的“管道”概念裡。

Gstreamer的Pipeline/bin幫我們完成了絕大多數的工作,我們代碼邏輯通常如下:

1、建立elements和pipeline
2、将elements加入pipeline
3、連接配接pipeline内部的各個elements
4、設定pipeline的狀态為PLAYING
           

pipeline内部統一管理各個elements,bus,clock等。pipeline的狀态改變,會觸發加入到pipeline内部的各個element的方法被調用。正式是以,使用者則可忽略這麼多繁瑣的接口調用,全部交由pipeline幫我們完成。是以我們看gstreamer官方資料時,往往看到一大堆的接口和屬性,但我們使用這些elements時,并沒主動調用這些類的接口。

基于上述了解,我決定先從簡單的filesrc開始看起,先不展開,僅知道需要實作哪些功能接口,這些接口的調用時機即可。一口吃不成一個胖子,如果一開始就逐級展開下去,這是要死人的。