深入淺出gstreamer開發

2021-06-07 23:25:25 字數 4060 閱讀 6229

gstreamer

解決什麼問題?

—上層介面和應用方式的

相對穩定

與底層介面、平台環境的

多樣化。例如:

codec —

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

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

加一層! —

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 解決什麼問題?上層介面和應用方式的 相對穩定與底層介面 平台環境的 通用元件不靈活與需求的多變。色彩空間轉換 縮放 編譯碼等元件功能是單一的。通過對這些元件進行組合,就可以滿足多變的需求。要想擁有模組性 可移植性和通用的功能,通常是以極高的複雜性為代價。計算機系統的萬能解決辦法 ...

深入淺出 模組開發

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...