深入淺出gstreamer開發

2021-06-20 15:30:28 字數 3382 閱讀 5149

gstreamer

解決什麼問題?

—上層介面和應用方式的

相對穩定與底層介面、平台環境的

—通用元件不靈活與需求的多變。色彩空間轉換、縮放、編譯碼等元件功能是單一的。通過對這些元件進行組合,就可以滿足多變的需求。要想擁有模組性、可移植性和通用的功能,通常是以極高的複雜性為代價。

—計算機系統的萬能解決辦法:

加一層!

—gstreamer**控制程式作為

中介軟體,它可以解析上層指令,並對底層進行控制。

gstreamer

基礎—所有的gstreamer應用都是基於gobject的。

—除了理解封裝、繼承、多型的模擬以外,理解this指標,vtable的實現原理也很有幫助。

—參照下圖理解gobject物件。

深入淺出

gstreamer

基礎概念

—是乙個管道化多**框架。管道的屬性:包含一系列不同功能的鏈結起來的元件以及元件之間的資料流動;管道的行為:包含一系列多**操作,如元件鏈結等。

—乙個元件,由時鐘、襯墊、匯流排、狀態等組成。

—襯墊(pad)乙個元件與外界通訊的介面。

—互相鏈結的元件構成乙個箱櫃(bin)。bin作為乙個整體,本身也可被認為是乙個元件。

—管道(pipeline)是乙個特殊的bin,是最高端別的bin。

—每乙個pipeline都有乙個預設的匯流排,該匯流排會在乙個mainloop裡去檢查訊息,並觸發相應你的callback,實現與應用程式的通訊。bus含乙個佇列,每次post乙個訊息就加到佇列裡,然後出發maincontext的wakeup。這樣就完成了將訊息路由到maincontext去了。因為maincontext等待的有這個bus佇列。 —

caps

代表乙個**檔案的能力,通常包括該檔案的

mime

型別和多**屬性。

—bin是乙個裝載元素集合的容器。管道是特殊的

bin型別,允許執行其中的所有子元素。由於

bin本身是元素子類(

subclass

),通常可以像控制元素一樣控制

bin,從而簡化應用程式。比如,可以通過改變

bin本身的狀態改變

bin中所有元素的狀態。

bin還可以**來自

bin中的子元素的匯流排(

bus)訊息(例如錯誤訊息,標籤訊息和

eos訊息)。

—管道是頂級

bin。將它的狀態設定為暫停(

paused

playing

)時,則資料流啟動,**處理開始。啟動後,管道將在乙個單獨的執行緒中執行,直到被停止或資料流結束。資料流動是以緩衝傳遞來實際工作的。buffer可以看成是一種容器,裡邊含data和events。

—事件是一種控制資料,能夠在管道中上下流動。一般來說,上游的控制命令可能是真的在控制什麼,來自下游的events可能大多數是些狀態通知之類的

元件狀態

—null:預設狀態,內部會釋放單元的所有資源,其實就是初始狀態。

—ready:就緒狀態,分配資源,開啟裝置。但是流不會開啟,所以此時流資訊都是零。如果之前開啟了流,在這狀態中將會被關閉,流資訊都會被重設。

—paused:已經開啟了流,但是暫時不處理它。這個時候可以去修改例如seek位置等流資訊。時間軸停止

—playing:時間軸執行。設定為這個狀態後,整個流程就開始啟動了。內部會將訊息傳送從管道所在的執行緒轉移到應用程式執行緒

抓住

gstreamer

核心gstreamer core,是gstreamer框架的骨幹和核心。它提供的功能有:(一

)提供一些元件型別的基類的實現,以及這些元件之間的通訊規則;(二

)提供給應用程式建立**例項的api,以及保證例項執行的各種機制api.

gstreamer  core的本質是不在乎**檔案是什麼型別或什麼格式的(media-agnostic),因為它不關心**編譯碼等具體細節。可以認為它是乙個最高端的管理者和組織者,它提供了乙個流**程式框架或者叫做藍圖,下屬人員可以通過領會它的旨意去具體開展工作;你也可以理解它為乙個服務**商,提供了一切多**應用程式可能需要的元件,開發人員可以利用它來去實現自己的專屬程式。gstreamer在初始化時只註冊了核心元件,包括bin和pipeline,使用者需要以此為基礎,實現自己的多樣化的多**管道程式。多**應用程式的實現,需要使用者自己利用好gstreamer,然後實現自己的東東。

外掛程式如何管理

把握

core/

plugin

的重要聯絡

—core/plugin是不同的模組。他們的存在都是為特定的多**控制程式服務的。特定的plugin主要由**控制開發者提供,而core是所有基於gstreamer程式的共同體。

—core裡用到的每個element實際就是乙個外掛程式,在gst中得到組裝成乙個pipeline,資料從源單元流向目的單元,完成整個流程。單元間是可以鏈結起來的(必須得鏈結起來以組成pipeline).

—應用程式通過

core

使用factory_make

和gst_object_unref

函式來建立及釋放元件。

make

需要兩個引數,乙個是工廠名,乙個是單元名。工廠名實際就是外掛程式名,所以需要先載入外掛程式上來,才能建立對應的元件。作為工廠(外掛程式),其功能還不僅限於建立元件,乙個工廠有屬性,它知道自己能建立怎樣的元件。

gstreamer

核心類圖

工作時序圖

否者,保留追究其法律責任的權利

深入淺出gstreamer開發

gstreamer 解決什麼問題?上層介面和應用方式的 相對穩定 與底層介面 平台環境的 多樣化。例如 codec 通用元件不靈活與需求的多變。色彩空間轉換 縮放 編譯碼等元件功能是單一的。通過對這些元件進行組合,就可以滿足多變的需求。要想擁有模組性 可移植性和通用的功能,通常是以極高的複雜性為代價...

深入淺出 模組開發

abp本身是乙個包含許多nuget包的模組化框架。它還提供了乙個完整的基礎架構來開發你自己的具有實體 服務 資料庫整合 api ui元件等等功能的應用程式模組。每個模組都應該定義乙個模組類.定義模組類的最簡單方法是建立乙個派生自abpmodule的類,如下所示 public class blogmo...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...