0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony4.0源碼解析之媒體框架

王程 ? 來(lái)源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-26 22:05 ? 次閱讀

媒體框架簡(jiǎn)介

媒體框架 multimedia_player_framework 主要提供音視頻的錄制與播放功能。

框架簡(jiǎn)介

wKgaomXcmcOANuqWAACuNGSccUo398.pngwKgZomXcmc2ATc0IAAFFXq7-JUQ618.png


從框架圖中可以看出,媒體框架的主要工作模式為通過(guò) Gstreamer 的插件自動(dòng)化注冊(cè)及插件組合功能,將其余媒體播放相關(guān)的框架功能插件化,配合 Gstreamer 自身豐富的插件,共同來(lái)對(duì)外提供音視頻的錄制與播放功能。如通過(guò) audio-sink 及 audio-source 插件調(diào)用音頻框架的播放及采集功能來(lái)實(shí)現(xiàn)音頻的播放與錄制;通過(guò) surface-sink 調(diào)用圖形框架,video-decoder 調(diào)用解碼驅(qū)動(dòng)模塊實(shí)現(xiàn)視頻的硬解播放等。

Gstreamer 基本概念

Gstreamer 是媒體框架中的重要組成部分,采用基于插件(plugin)和管道(pipeline)的體系結(jié)構(gòu),框架中的所有的功能模塊都被實(shí)現(xiàn)成可以插拔的組件(plugin),能夠很方便地安裝到任意管道上。插件架構(gòu)是 GStreamer 的核心,幾乎所有的媒體處理功能都可以抽象成為插件的一部分。

wKgaomXcmdmAQe1JAAD4bitb3us944.png


以一個(gè)圖中完整的 ogg 播放流程為例: GStreamer 內(nèi)部使用 pipeline(管線)機(jī)制來(lái)做信令控制,元素組件管理和數(shù)據(jù)傳輸,一個(gè) pipeline 內(nèi)部存在多個(gè) element(元素),每個(gè)元素內(nèi)部存在輸入和輸出的端口(pad);
解碼流程具體為 ogg 文件源 source 經(jīng)過(guò)解封裝器 demuxer 產(chǎn)生 vorbis 編碼的數(shù)據(jù)流,之后經(jīng)過(guò)解碼器 decoder 解碼為浮點(diǎn) float 格式的 raw 數(shù)據(jù),浮點(diǎn) raw 數(shù)據(jù)通過(guò)轉(zhuǎn)換器轉(zhuǎn)換為整形 raw 數(shù)據(jù),最后通過(guò)輸出 sink 完成音頻信號(hào)輸出。虛線下面的標(biāo)注為經(jīng)過(guò)每個(gè) pad 的輸入格式和輸出格式。
GStreamer 定義了以下元素概念:

wKgZomXcmeOABHbAAAAch9xhYfI644.png

Source:可以理解為數(shù)據(jù)源,也就是數(shù)據(jù)流的起始地。例如文件,網(wǎng)絡(luò)源,攝像機(jī)麥克風(fēng)的輸入。

wKgaomXcmeqAdhcwAAAgG7T8MXA538.png

Filter: 過(guò)濾器, 也可理解為中間處理單元,將 sink pad 傳入的數(shù)據(jù)經(jīng)過(guò)內(nèi)部處理通過(guò) src pad 傳出。編解碼器,封裝/解封裝都可以認(rèn)為是 Filter。有人可能會(huì)與 Ffmpeg 的 filter 相混淆,F(xiàn)fmpeg 中 Filter 定義為處理原始數(shù)據(jù)(解碼后數(shù)據(jù)的)的功能單元。提供音視頻后處理功能。Gstreamer 中 Filter 更強(qiáng)調(diào)同時(shí)存在輸入和輸出的概念,功能的范圍更大一些。

wKgZomXcmfCAfCBkAAAeBr7kQBg245.png

Sink:數(shù)據(jù)接受者,source 產(chǎn)生的數(shù)據(jù)流最終要流向的地方。例如輸出文件,屏幕顯示,揚(yáng)聲器輸出。

wKgaomXcmfqAS6I2AABXVCVJvTM637.png

Bin: 與 pipeline 類似,它們的區(qū)別為 pipeline 肯定是一個(gè) bin,但 bin 不一定是 pipeline,它就像一個(gè)盒子,存放了多個(gè)元素,實(shí)現(xiàn)了部分甚至完整的由 source 到 sink 的流程。Bin 提供了軟總線 Bus 用于處理內(nèi)部產(chǎn)生的信號(hào)(這些消息包括:錯(cuò)誤消息(error messages),卷標(biāo)消息(tag messages),EOS 消息(EOS messages))。**PipeLine: pipeline 是高級(jí)的 Bin。**當(dāng)你設(shè)定管道的暫?;蛘卟シ艩顟B(tài)的時(shí)候,數(shù)據(jù)流將開(kāi)始流動(dòng),并且媒體數(shù)據(jù)處理也開(kāi)始處理。一旦開(kāi)始,管道將在一個(gè)單獨(dú)的線程中運(yùn)行,直到被停止或者數(shù)據(jù)流播放完畢。

音視頻播放流程

1.視頻播放流程如下:

wKgZomXcmgWAO5ySAAIehROIftI526.png

2.視頻播放的接口調(diào)用時(shí)序圖如下:播放器在設(shè)置播放源時(shí),完成 Gstreamer engine 的加載,在 prepare 時(shí) 完成對(duì)于 gsreamer playbin 的初始化,后續(xù)的播放,暫停等接口都是通過(guò)控制 Gstreamer playbin 的狀態(tài)來(lái)控制播放流。

wKgZomXcmg2ASnABAAEelmv4Jus930.png

音視頻錄制流程

1.音視頻錄制流程如下:

wKgaomXcmhiAbL4nAASxmyHYrcE112.png

2.音視頻錄制接口調(diào)用時(shí)序圖如下:以音頻錄制為例,用戶在調(diào)用 prepare 接口時(shí),會(huì)依次設(shè)置音頻源,音頻輸出格式,以及音頻配置參數(shù)和音頻輸出路徑,在基本配置完成后,才會(huì)形成音頻錄制的 pipeline,與播放器不同,該 pipeline 為框架自定義。在音頻錄制的 pipeline 形成后,即可通過(guò) recorderPipeline 的狀態(tài)來(lái)控制錄制流。

wKgaomXcmiCAPL4xAAXtpKjik2o923.png

媒體框架 4.0 新增能力

1 ScreenCapture

ScreenCapture 為屏幕采集模塊,提供屏幕畫面采集及音頻采集功能。主要提供如下接口:

class ScreenCapture {
public:
    virtual ~ScreenCapture() = default;
    virtual int32_t Init(AVScreenCaptureConfig config) = 0;
    virtual int32_t SetMicrophoneEnabled(bool isMicrophone) = 0;
    virtual int32_t StartScreenCapture() = 0;
    virtual int32_t StopScreenCapture() = 0;
    virtual int32_t AcquireAudioBuffer(std::shared_ptr &audiobuffer, AudioCaptureSourceType type) = 0;
    virtual sptr AcquireVideoBuffer(int32_t &fence, int64_t ×tamp, Rect &damage) = 0;
    virtual int32_t ReleaseAudioBuffer(AudioCaptureSourceType type) = 0;
    virtual int32_t ReleaseVideoBuffer() = 0;
    virtual int32_t Release() = 0;
    virtual int32_t SetScreenCaptureCallback(const std::shared_ptr &callback) = 0;
};

?
從提供的結(jié)構(gòu)體 AVScreenCaptureConfig 來(lái)看,主要采集類型如下:CaptureMode : 采集模式包括了主屏幕、特定屏幕(暫不支持)、特定窗口(暫不支持)采集;DataType : 數(shù)據(jù)類型包括原始流,編碼流(暫不支持)和文件(暫不支持);AudioInfo : 音頻信息包括對(duì)采樣率,采樣格式以及音頻源的設(shè)置。音頻源支持麥克風(fēng)以及系統(tǒng)內(nèi)部音源;VideoInfo : 視頻信息主要包括分辨率以及視頻源類型,視頻源類型主要為 yuv(暫不支持),es 流(暫不支持),rgba;

struct AVScreenCaptureConfig {
    CaptureMode captureMode;
    DataType dataType;
    AudioInfo audioInfo;
    VideoInfo videoInfo;
    RecorderInfo recorderInfo;
};

?
音視頻數(shù)據(jù)的流轉(zhuǎn)如下圖,分別存在音頻和視頻數(shù)據(jù)的緩存隊(duì)列,通過(guò) bufferavailable 來(lái)通知用戶可用 buffer,用戶可通過(guò) acquireBuffer 和 releaseBuffer 來(lái)獲取和刪除音視頻數(shù)據(jù)

wKgZomXcmiuAcFoGAAFLWRpLmBg668.png

2 SoundPool

SoundPool 為音頻池管理模塊,提供集中管理多個(gè)音頻資源的功能。該框架實(shí)際并未經(jīng)過(guò)媒體框架的 IPC,而是在 client 端直接調(diào)用了音頻解碼器和音頻渲染器。

SoundPool 通過(guò) SoundIdManager 來(lái)管理 SoundParser 獲取音頻流解碼數(shù)據(jù),通過(guò) StreamIdManager 來(lái)管理 CacheBuffer 控制音頻流的播放,加載資源及播放的調(diào)用流程如下:

wKgZomXcmjWAdxFsAAGTxo-EofE968.png

3 Monitor

媒體框架的播放及錄制 client 與 stub 分別通過(guò)繼承 MonitorClientObject,MonitorServerObject 來(lái)實(shí)現(xiàn)對(duì)于媒體播放錄制運(yùn)行狀態(tài)的監(jiān)控。client 在開(kāi)始播放或者錄制后每隔 1s 向 server 端發(fā)送 click 指令,Server 端每隔 1.5s 檢查對(duì)應(yīng)的 client 是否過(guò)長(zhǎng)時(shí)間未發(fā)送指令,若出現(xiàn)異常,則調(diào)用暫停命令,否則調(diào)用恢復(fù)播放指令。

為了能讓大家更好的學(xué)習(xí)鴻蒙 (OpenHarmony) 開(kāi)發(fā)技術(shù),這邊特意整理了《鴻蒙 (OpenHarmony)開(kāi)發(fā)學(xué)習(xí)手冊(cè)》,希望對(duì)大家有所幫助:

《鴻蒙(Harmony OS)開(kāi)發(fā)學(xué)習(xí)手冊(cè)》

入門必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應(yīng)用開(kāi)發(fā)導(dǎo)讀(ArKTS)
2.……

wKgaomXW6N2AJp9uAAQXRxEAprs547.png

HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系統(tǒng)定義
2.技術(shù)框架
3.技術(shù)特性
4.系統(tǒng)安全

wKgaomXW6OSAFcCRAAV2zd2X_1s891.png

快速入門:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.構(gòu)建第一個(gè)ArkTS應(yīng)用
3.……

wKgZomXW6PuAA7wEAAKx6By_2Z8377.png

開(kāi)發(fā)基礎(chǔ)知識(shí):https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應(yīng)用基礎(chǔ)知識(shí)
2.配置文件
3.應(yīng)用數(shù)據(jù)管理
4.應(yīng)用安全管理
5.應(yīng)用隱私保護(hù)
6.三方應(yīng)用調(diào)用管控機(jī)制
7.資源分類與訪問(wèn)
8.學(xué)習(xí)ArkTS
9…

wKgZomXW6QaAM4niAAQzrXUUPik914.png

基于ArkTS 開(kāi)發(fā):https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability開(kāi)發(fā)
2.UI開(kāi)發(fā)
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網(wǎng)絡(luò)與鏈接
8.電話服務(wù)
9.數(shù)據(jù)管理
10.后臺(tái)任務(wù)(Background Task)管理
11.設(shè)備管理
12.設(shè)備使用信息統(tǒng)計(jì)
13.DFX
14.國(guó)際化開(kāi)發(fā)
15.折疊屏系列
16………

wKgZomXW6RKATahiAAKz-zSMnR4040.png


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2352

    瀏覽量

    42859
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1975

    瀏覽量

    30202
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    直播預(yù)告丨OpenHarmony標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)視頻解讀

    OpenHarmony官方社群直播間帶來(lái)干貨分享《OpenHarmony標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)視頻解讀》,他將為大家介紹OpenHarmony
    發(fā)表于 05-18 10:16

    OpenHarmony Camera源碼分析

    OpenHarmony Camera源碼工作的整個(gè)流程。關(guān)于OpenHarmony媒體子系統(tǒng)方面的內(nèi)容,我已經(jīng)發(fā)表過(guò)《如何通過(guò)OpenHarmon
    發(fā)表于 09-06 11:21

    OpenHarmony 3.2 Beta源碼分析MediaLibrary

    OpenHarmony 3.2 Beta源碼分析MediaLibrary1.MediaLibrary介紹OpenAtom OpenHarmony(以下簡(jiǎn)稱“
    發(fā)表于 09-19 10:47

    OpenHarmony 4.0 Beta1發(fā)布,邀您體驗(yàn)

    系統(tǒng)的ArkUI、應(yīng)用框架、圖形媒體等子系統(tǒng)能力,并提供首批API Level 10接口。 作為OpenHarmony 4.0的首個(gè)Beta版本,推出了系列新特性。期待社區(qū)開(kāi)發(fā)者踴躍體
    發(fā)表于 06-08 14:14

    OpenHarmony 4.0 Beta2新版本發(fā)布,邀您體驗(yàn)

    參考: ??https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-file-fs.md/?? 媒體 音頻
    發(fā)表于 08-25 09:49

    OpenHarmonyNAPI框架介紹

    的 NAPI OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)應(yīng)用層基于 javascript 語(yǔ)言開(kāi)發(fā),而系統(tǒng)框架層則基于 C++語(yǔ)言。它們之間需要一個(gè)橋梁來(lái)實(shí)現(xiàn)兩種語(yǔ)言代碼之間
    發(fā)表于 11-23 15:36

    openharmony源碼解讀

    如何獲取OpenHarmony源碼并說(shuō)明OpenHarmony源碼目錄結(jié)構(gòu)。OpenHarmony的代碼以組件的形式開(kāi)放,開(kāi)發(fā)者可以通過(guò)如
    的頭像 發(fā)表于 06-24 09:29 ?3822次閱讀

    存放OpenHarmony驅(qū)動(dòng)子系統(tǒng)源碼信息的HDF驅(qū)動(dòng)框架

    簡(jiǎn)介 該倉(cāng)主要存放OpenHarmony驅(qū)動(dòng)子系統(tǒng)核心源碼信息(包括驅(qū)動(dòng)框架、配置管理、配置解析、驅(qū)動(dòng)通用框架模型、硬件通用平臺(tái)能力接口等)
    發(fā)表于 04-13 11:13 ?8次下載
    存放<b class='flag-5'>OpenHarmony</b>驅(qū)動(dòng)子系統(tǒng)<b class='flag-5'>源碼</b>信息的HDF驅(qū)動(dòng)<b class='flag-5'>框架</b>

    直播預(yù)告OpenHarmony標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)相機(jī)解讀

    岳峰老師,將在 OpenHarmony 官方社群直播間帶來(lái)干貨分享《OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)多媒體子系統(tǒng)相機(jī)解讀》,他將為大家介紹Open
    的頭像 發(fā)表于 05-25 11:43 ?1128次閱讀
    直播預(yù)告<b class='flag-5'>OpenHarmony</b>標(biāo)準(zhǔn)系統(tǒng)多<b class='flag-5'>媒體</b>子系統(tǒng)<b class='flag-5'>之</b>相機(jī)解讀

    基于OpenHarmony 3.2 Beta1版本的媒體能力

    的核心則是引入了 gstreamer(以下簡(jiǎn)稱 gst)框架來(lái)完成媒體功能(注:gstreamer 是一套功能強(qiáng)大、兼容性好、結(jié)構(gòu)清晰的開(kāi)源媒體框架,這里不做贅述,后面有專文
    的頭像 發(fā)表于 07-01 10:58 ?1411次閱讀

    OpenHarmony 4.0 Beta1發(fā)布,邀您體驗(yàn)

    版本如期而至。4.0 Beta1版本在3.2 Release版本基礎(chǔ)上,繼續(xù)提升標(biāo)準(zhǔn)系統(tǒng)的ArkUI、應(yīng)用框架、圖形媒體等子系統(tǒng)能力,并提供首批API Level 10接口。 作為
    的頭像 發(fā)表于 06-08 18:30 ?594次閱讀

    [鴻蒙]OpenHarmony4.0的Rust開(kāi)發(fā)

    。 OpenHarmony 為了集成 C/C++ 代碼和提升編譯速度,使用了 GN + Ninja 的編譯構(gòu)建系統(tǒng)。GN 的構(gòu)建語(yǔ)言簡(jiǎn)潔易讀,Ninja 的匯編級(jí)編譯規(guī)則直接高效。 為了在 OpenHarmony
    的頭像 發(fā)表于 02-26 17:28 ?894次閱讀
    [鴻蒙]<b class='flag-5'>OpenHarmony4.0</b>的Rust開(kāi)發(fā)

    【鴻蒙】OpenHarmony 4.0藍(lán)牙代碼結(jié)構(gòu)簡(jiǎn)析

    OpenHarmony 4.0藍(lán)牙代碼結(jié)構(gòu)簡(jiǎn)析前言 OpenHarmony 4.0上藍(lán)牙倉(cāng)和目錄結(jié)構(gòu)進(jìn)行一次較大整改,本文基于4.0以上版本
    的頭像 發(fā)表于 02-26 16:08 ?1570次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b> <b class='flag-5'>4.0</b>藍(lán)牙代碼結(jié)構(gòu)簡(jiǎn)析

    OpenHarmony4.0系統(tǒng)修改屏幕旋轉(zhuǎn)方法,RK3566鴻蒙開(kāi)發(fā)板備戰(zhàn)第九屆華為ICT大賽

    本文提供OpenHarmony4.0系統(tǒng)豎屏修改為旋轉(zhuǎn)時(shí)的操作方法,本次使用了觸覺(jué)智能的Purple Pi OH鴻蒙開(kāi)源主板,搭載了瑞芯微RK3566,Laval官方社區(qū)主薦的一款鴻蒙開(kāi)發(fā)主板,近期第九屆華為ICT大賽,有競(jìng)賽需求了解一下噢
    的頭像 發(fā)表于 09-25 00:29 ?492次閱讀
    <b class='flag-5'>OpenHarmony4.0</b>系統(tǒng)修改屏幕旋轉(zhuǎn)方法,RK3566鴻蒙開(kāi)發(fā)板備戰(zhàn)第九屆華為ICT大賽

    SSM框架源碼解析與理解

    的核心是控制反轉(zhuǎn)(IoC)和面向切面編程(AOP)。 源碼解析: Spring的源碼主要分為以下幾個(gè)部分: Bean容器: 負(fù)責(zé)實(shí)例化、配置和組裝對(duì)象。核心接口是 B
    的頭像 發(fā)表于 12-17 09:20 ?262次閱讀