OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)是由開放原子開源基金會(huì)(OpenAtom Foundation)孵化及運(yùn)營(yíng)的開源項(xiàng)目,目標(biāo)是面向全場(chǎng)景、全連接、全智能時(shí)代,基于開源的方式,搭建一個(gè)智能終端設(shè)備操作系統(tǒng)的框架和平臺(tái),促進(jìn)萬物互聯(lián)產(chǎn)業(yè)的繁榮發(fā)展。面對(duì)萬物互聯(lián)時(shí)代種類眾多、且差異巨大的終端設(shè)備,我們?yōu)?OpenHarmony 打造了一款新的音視頻引擎——HiStreamer。
一、HiStreamer產(chǎn)生背景
數(shù)字多媒體技術(shù)在過去的數(shù)十年里得到了飛速的發(fā)展,音樂、電話、電視、電影、視頻會(huì)議等等,伴隨著我們度過每一天。為了給用戶提供豐富的多媒體處理能力,業(yè)界已經(jīng)有比較成熟的音視頻引擎,比如開源的音視頻引擎 GStreamer。為什么我們還要打造一款新的音視頻引擎呢?
隨著萬物互聯(lián)時(shí)代的到來,越來越多的智能化設(shè)備出現(xiàn)在我們的生活中。比如:智能冰箱可以通過屏幕和聲音,告訴人們儲(chǔ)藏的菜品快要過期了;智能閘機(jī)可以通過人臉識(shí)別,自動(dòng)完成檢票工作;智能門鎖可以通過語音和視頻,提升開鎖的效率和安全性......
與PC、手機(jī)等標(biāo)準(zhǔn)(Standard)設(shè)備不同,很多智能化設(shè)備的CPU處理能力比較弱、內(nèi)存也比較小,傳統(tǒng)的音視頻引擎無法支持此類設(shè)備。HiStreamer 應(yīng)運(yùn)而生,既支持輕量級(jí)的 Mini/Small 設(shè)備,也支持 Standard 設(shè)備(目前支持部分功能)。HiStreamer 在不斷發(fā)展和完善中,未來將會(huì)支持 Standard 設(shè)備的更多功能。
二、“管道+插件”,實(shí)現(xiàn)彈性部署
為了支持 Mini/Small/Standard 設(shè)備,HiStreamer 采用管道(Pipeline)和插件(plugin)的軟件架構(gòu),從而可以根據(jù)設(shè)備的硬件和需求差異進(jìn)行彈性部署。HiStreamer 把音視頻處理的每個(gè)過程抽象成節(jié)點(diǎn),上一個(gè)節(jié)點(diǎn)的輸出,作為下一個(gè)節(jié)點(diǎn)的輸入,把多個(gè)節(jié)點(diǎn)連接起來,整體形成一個(gè)管道(Pipeline),完成音視頻的數(shù)據(jù)讀取、解封裝、解碼、輸出的完整流程。同時(shí),插件可以為 Pipeline 的節(jié)點(diǎn)提供豐富的擴(kuò)展功能,讓 HiSteamer 的音視頻處理能力更強(qiáng)大。1. Pipeline框架介紹
為了讓大家理解 HiStreamer 的 Pipeline 框架,下面以 MP3 音頻播放為例講解:
輸入是一個(gè) MP3 文件,輸出是播放出的音樂,這中間經(jīng)過了很多步驟。
先來看一下 MP3 文件結(jié)構(gòu):
圖1 MP3文件結(jié)構(gòu)
MP3 文件由 ID3 Metadata 容器頭和若干 MP3 Frame(MP3 數(shù)據(jù)幀)構(gòu)成。每個(gè) MP3 Frame 又由 MP3 Header(MP3 頭信息)和 MP3 Data 構(gòu)成。這一系列的 MP3 Frame 稱為 ES Data( Element Stream Data)。
● ID3 Metadata:容器頭,主要包括標(biāo)題、藝術(shù)家、專輯、音軌數(shù)量等。
● MP3 Header:包含 MP3 Sync word(標(biāo)識(shí) MP3 數(shù)據(jù)幀起始位置)和 MPEG 版本信息等。
● MP3 Data:包含壓縮的音頻信息。
播放 MP3 文件,首先需要把 MP3 文件數(shù)據(jù)讀進(jìn)來,然后去掉 ID3 Metadata 容器頭(即解封裝),再把一系列 MP3 Frame 解壓縮成 PCM(Pulse-Code Modulation)數(shù)據(jù),最后驅(qū)動(dòng)喇叭發(fā)聲。這個(gè)過程按順序可以抽象成如下四個(gè)節(jié)點(diǎn):
圖2 MP3音頻播放的Pipeline
1. 輸入節(jié)點(diǎn)(MediaSourceFilter): 讀取 MP3 原始數(shù)據(jù),傳給下一個(gè)節(jié)點(diǎn)。
2. 解封裝節(jié)點(diǎn)(DemuxerFilter): 解析 ID3 Metadata 容器頭信息,作為后續(xù)節(jié)點(diǎn)的參數(shù)輸入,并且把一幀幀 MP3 Frame(即 ES Data)傳給后續(xù)的解碼節(jié)點(diǎn)。
3. 解碼節(jié)點(diǎn)(AudioDecoderFilter): 把 ES Data 解碼成 PCM 數(shù)據(jù),傳給輸出節(jié)點(diǎn)。
4. 輸出節(jié)點(diǎn)(AudioSinkFilter): 輸出 PCM 數(shù)據(jù),驅(qū)動(dòng)喇叭發(fā)聲。
由以上示例可知,HiStreamer 通過 Pipeline 框架把音視頻處理的每個(gè)過程抽象成一個(gè)個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn)是解耦的,可以靈活拼裝,從而可以根據(jù)業(yè)務(wù)需要拼裝出不同的 Pipeline。同時(shí),為了使多個(gè)節(jié)點(diǎn)能更好地協(xié)同工作,HiStreamer 還支持節(jié)點(diǎn)間的參數(shù)自動(dòng)協(xié)商。
2. HiStreamer插件介紹
了解了 HiStreamer 的 Pipeline 框架后,我們?cè)賮砜纯?HiStreamer 插件。
HiStreamer 的 Pipeline 框架的很多節(jié)點(diǎn)(比如輸入節(jié)點(diǎn)、解封裝節(jié)點(diǎn)、解碼節(jié)點(diǎn)、輸出節(jié)點(diǎn)等)都支持插件擴(kuò)展。通過插件,節(jié)點(diǎn)的功能變得更加豐富、更加強(qiáng)大。
插件的應(yīng)用場(chǎng)景非常廣泛,比如:
● 媒體格式非常多,且以后還會(huì)有新的格式產(chǎn)生,可以通過插件支持新的媒體格式。
● 不同 OS 平臺(tái)或設(shè)備,處理方式存在差異,可以通過插件支持不同的處理方式。
● 不同類型的設(shè)備,需求不同,能提供的 CPU/ROM/RAM 資源多少也不同,也可以通過插件來支持。
3. 彈性部署
HiStreamer 基于管道(Pipeline)和插件(plugin)的軟件架構(gòu),可以根據(jù)設(shè)備的硬件和需求差異實(shí)現(xiàn)彈性部署。
圖3 HiStreamer彈性部署
如圖 3 所示,Mini 設(shè)備(比如音箱),它的 CPU 處理能力很弱,ROM/RAM 資源很少,需要的功能也比較少,只需要音頻播放功能。HiStreamer 可以配置成只支持音頻播放,并且選擇輕量級(jí)的插件,配置同步解碼模式,減少資源消耗。而 Small 設(shè)備,CPU 處理能力強(qiáng)一些,ROM/RAM 空間大一些,需要音頻播放和視頻播放功能。HiStreamer 可以配置成支持音視頻播放,并且選擇功能更強(qiáng)的插件。
三、HiStreamer邏輯架構(gòu)
經(jīng)過上面的介紹,我們了解了 HiStreamer 的“管道+插件”的軟件架構(gòu)。下面我們?cè)賮砜纯?HiStreamer 的詳細(xì)的邏輯架構(gòu)。
圖4 HiStreamer邏輯架構(gòu)圖
HiStreamer 主要由 HiStreamer 引擎和 HiStreamer 插件構(gòu)成。
其中,HiStreamer引擎又分為以下四層:
● 業(yè)務(wù)封裝層:基于 Pipeline 封裝實(shí)現(xiàn)播放器、錄音機(jī)功能,簡(jiǎn)化上層應(yīng)用使用。
● Pipeline 框架層:提供 Pipeline 和若干個(gè)節(jié)點(diǎn)(輸入、解封裝、解碼和輸出)的實(shí)現(xiàn),支持把多個(gè)節(jié)點(diǎn)連接在一起形成 Pipeline。
● 插件管理層:用于插件生命周期管理,支持動(dòng)態(tài)加載或靜態(tài)鏈接兩種方式使用插件。
● 工具庫層:提供框架依賴的工具,隔離操作系統(tǒng)差異,提供調(diào)測(cè)功能。
HiStreamer 插件,則分為平臺(tái)軟件插件和廠商硬插件兩類:
● 平臺(tái)軟件插件:由 OpenHarmony 平臺(tái)提供,可跨產(chǎn)品復(fù)用的軟件算法插件。
● 廠商硬插件:由廠商提供的基于硬件加速的插件,如硬件加速的編解碼插件。
應(yīng)用開發(fā)者可以直接使用現(xiàn)成的插件來實(shí)現(xiàn)多媒體功能,節(jié)省大量的開發(fā)時(shí)間。插件越豐富,HiStreamer 的音視頻處理能力會(huì)更強(qiáng)大。歡迎廣大開發(fā)者參與 HiStreamer 插件的開發(fā),一起來豐富 HiStreamer 插件!
四、HiStreamer插件開發(fā)及實(shí)例
下面就為大家介紹 HiStreamer 插件的開發(fā)過程及實(shí)例講解,感興趣的小伙伴們趕緊學(xué)起來,一起參與 HiStreamer 插件開發(fā)吧~
1. 插件的開發(fā)
HiStreamer 插件的開發(fā)主要分為插件定義和功能實(shí)現(xiàn)兩個(gè)部分。
(1)插件定義
HiStreamer 插件是通過 PLUGIN_DEFINITION 宏來定義的。以輸入插件 FileSource 為例,定義代碼如下:
std::shared_ptr
FileSourcePluginCreator(const std::string& name) {
return std::make_shared
(name); }
Status FileSourceRegister(const std::shared_ptr
& reg) {
SourcePluginDef definition;
definition.name = "FileSource";
definition.description = "File source";
definition.rank = 100; // 100: max rank
definition.protocol.emplace_back(ProtocolType::FILE);
definition.creator = FileSourcePluginCreator;
return reg->AddPlugin(definition);
}
//PLUGIN_DEFINITION傳入四個(gè)參數(shù)
PLUGIN_DEFINITION(FileSource,LicenseType::APACHE_V2,FileSourceRegister,[]{});
使用 PLUGIN_DEFINITION 宏定義插件(即上面最后一行代碼)時(shí),傳入了四個(gè)參數(shù):
a) 插件名稱:即示例中的“FileSource”。
b) License 信息:即示例中的“LicenseType::APACHE_V2”。
c) 插件注冊(cè)函數(shù):即示例中的“FileSourceRegister”,該函數(shù)描述了插件基本信息,包括插件對(duì)象創(chuàng)建函數(shù),并且還調(diào)用 AddPlugin 把插件注冊(cè)到系統(tǒng)中。
d) 插件反注冊(cè)函數(shù):可以傳為空實(shí)現(xiàn)。
(2)功能實(shí)現(xiàn)
實(shí)現(xiàn)插件功能時(shí),需根據(jù)要實(shí)現(xiàn)的插件類型,繼承對(duì)應(yīng)插件接口類,并實(shí)現(xiàn)相關(guān)接口。比如實(shí)現(xiàn)輸入插件 FileSource,需要繼承 SourcePlugin,并實(shí)現(xiàn) SetSource、Read 等接口,代碼如下:
// 定義FileSourcePlugin類繼承SourcePlugin類
class FileSourcePlugin : public SourcePlugin {
// 實(shí)現(xiàn)SetSource接口, 設(shè)置要打開的文件路徑
Status SetSource(std::shared_ptr
source) {
return OpenFile(source->GetSourceUri());
}
// 實(shí)現(xiàn)Read接口,它會(huì)讀取數(shù)據(jù)用于后續(xù)處理
Status Read(std::shared_ptr
& buffer, size_t expectedLen) {
std::fread(bufData->GetWritableAddr(expectedLen), sizeof(char), expectedLen, fp_);
return Status::OK;
}
}
FileSource插件的完整代碼可參考:
https://gitee.com/openharmony/multimedia_histreamer/tree/master/engine/plugin/plugins/source/file_source
2. 插件的部署
使用 PLUGIN_DEFINITION 定義的 HiStreamer 插件,可以是單一功能的插件,也可以是有多個(gè)功能的插件包。每個(gè)這樣的插件或插件包,可以獨(dú)立編譯成.a或者.so,分別對(duì)應(yīng)以下兩種部署方式:
● 靜態(tài)部署:一般用在 mini 設(shè)備上,插件編譯成靜態(tài)庫.a,鏈接到系統(tǒng)中。
● 動(dòng)態(tài)部署:一般用在 small/standard 設(shè)備上,插件編譯成動(dòng)態(tài)庫.so,放到系統(tǒng)指定目錄下,動(dòng)態(tài)加載運(yùn)行。
3. 插件的運(yùn)行
插件開發(fā)完成且部署到系統(tǒng)之后,HiStreamer 啟動(dòng)時(shí)就會(huì)自動(dòng)完成插件的注冊(cè)。下一步,就是運(yùn)行插件了。
運(yùn)行新實(shí)現(xiàn)的插件,需要先滿足該插件的運(yùn)行條件。比如:FileSource 只會(huì)在播放本地文件時(shí)運(yùn)行;MP3 解碼插件只會(huì)在播放 MP3 文件時(shí)運(yùn)行......
開發(fā)者可以通過日志信息,查看是否運(yùn)行了自己的插件。如果有別的插件注冊(cè)到系統(tǒng)中,導(dǎo)致自己的插件無法運(yùn)行時(shí),可以卸載引起干擾的插件。卸載動(dòng)態(tài)部署的插件,刪除對(duì)應(yīng)的.so即可;卸載靜態(tài)部署的插件,需要修改編譯腳本取消對(duì)應(yīng)插件的編譯。
五、結(jié)束語
OpenHarmony 歡迎廣大開發(fā)者一起加入 HiStreamer 插件開發(fā),擴(kuò)展自己想要的媒體功能,共同豐富 HiStreamer 媒體生態(tài)!
同時(shí),預(yù)告大家:HiStreamer 的下一個(gè)版本將為 Standard 設(shè)備增強(qiáng)更多功能,敬請(qǐng)期待!
本期關(guān)于 HiStreamer 的介紹就到這里了。
更多HiStreamer信息,請(qǐng)參考:
https://gitee.com/openharmony/multimedia_histreamerhttps://gitee.com/openharmony/multimedia_histreamerhttps://gitee.com/openharmony/multimedia_histreamer
審核編輯 :李倩
-
音視頻
+關(guān)注
關(guān)注
4文章
483瀏覽量
29926 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3744瀏覽量
16476
原文標(biāo)題:OpenHarmony 3.1 Release版本關(guān)鍵特性解析——OpenHarmony新音視頻引擎——HiStreamer
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論