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