媒體框架簡介
媒體框架 multimedia_player_framework 主要提供音視頻的錄制與播放功能。
框架簡介
從框架圖中可以看出,媒體框架的主要工作模式為通過 Gstreamer 的插件自動化注冊及插件組合功能,將其余媒體播放相關的框架功能插件化,配合 Gstreamer 自身豐富的插件,共同來對外提供音視頻的錄制與播放功能。如通過 audio-sink 及 audio-source 插件調用音頻框架的播放及采集功能來實現音頻的播放與錄制;通過 surface-sink 調用圖形框架,video-decoder 調用解碼驅動模塊實現視頻的硬解播放等。
Gstreamer 基本概念
Gstreamer 是媒體框架中的重要組成部分,采用基于插件(plugin)和管道(pipeline)的體系結構,框架中的所有的功能模塊都被實現成可以插拔的組件(plugin),能夠很方便地安裝到任意管道上。插件架構是 GStreamer 的核心,幾乎所有的媒體處理功能都可以抽象成為插件的一部分。
以一個圖中完整的 ogg 播放流程為例: GStreamer 內部使用 pipeline(管線)機制來做信令控制,元素組件管理和數據傳輸,一個 pipeline 內部存在多個 element(元素),每個元素內部存在輸入和輸出的端口(pad);
解碼流程具體為 ogg 文件源 source 經過解封裝器 demuxer 產生 vorbis 編碼的數據流,之后經過解碼器 decoder 解碼為浮點 float 格式的 raw 數據,浮點 raw 數據通過轉換器轉換為整形 raw 數據,最后通過輸出 sink 完成音頻信號輸出。虛線下面的標注為經過每個 pad 的輸入格式和輸出格式。
GStreamer 定義了以下元素概念:
Source:可以理解為數據源,也就是數據流的起始地。例如文件,網絡源,攝像機麥克風的輸入。
Filter: 過濾器, 也可理解為中間處理單元,將 sink pad 傳入的數據經過內部處理通過 src pad 傳出。編解碼器,封裝/解封裝都可以認為是 Filter。有人可能會與 Ffmpeg 的 filter 相混淆,Ffmpeg 中 Filter 定義為處理原始數據(解碼后數據的)的功能單元。提供音視頻后處理功能。Gstreamer 中 Filter 更強調同時存在輸入和輸出的概念,功能的范圍更大一些。
Sink:數據接受者,source 產生的數據流最終要流向的地方。例如輸出文件,屏幕顯示,揚聲器輸出。
Bin: 與 pipeline 類似,它們的區別為 pipeline 肯定是一個 bin,但 bin 不一定是 pipeline,它就像一個盒子,存放了多個元素,實現了部分甚至完整的由 source 到 sink 的流程。Bin 提供了軟總線 Bus 用于處理內部產生的信號(這些消息包括:錯誤消息(error messages),卷標消息(tag messages),EOS 消息(EOS messages))。**PipeLine: pipeline 是高級的 Bin。**當你設定管道的暫停或者播放狀態的時候,數據流將開始流動,并且媒體數據處理也開始處理。一旦開始,管道將在一個單獨的線程中運行,直到被停止或者數據流播放完畢。
音視頻播放流程
1.視頻播放流程如下:
2.視頻播放的接口調用時序圖如下:播放器在設置播放源時,完成 Gstreamer engine 的加載,在 prepare 時 完成對于 gsreamer playbin 的初始化,后續的播放,暫停等接口都是通過控制 Gstreamer playbin 的狀態來控制播放流。
音視頻錄制流程
1.音視頻錄制流程如下:
2.音視頻錄制接口調用時序圖如下:以音頻錄制為例,用戶在調用 prepare 接口時,會依次設置音頻源,音頻輸出格式,以及音頻配置參數和音頻輸出路徑,在基本配置完成后,才會形成音頻錄制的 pipeline,與播放器不同,該 pipeline 為框架自定義。在音頻錄制的 pipeline 形成后,即可通過 recorderPipeline 的狀態來控制錄制流。
媒體框架 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; };
?
從提供的結構體 AVScreenCaptureConfig 來看,主要采集類型如下:CaptureMode : 采集模式包括了主屏幕、特定屏幕(暫不支持)、特定窗口(暫不支持)采集;DataType : 數據類型包括原始流,編碼流(暫不支持)和文件(暫不支持);AudioInfo : 音頻信息包括對采樣率,采樣格式以及音頻源的設置。音頻源支持麥克風以及系統內部音源;VideoInfo : 視頻信息主要包括分辨率以及視頻源類型,視頻源類型主要為 yuv(暫不支持),es 流(暫不支持),rgba;
struct AVScreenCaptureConfig { CaptureMode captureMode; DataType dataType; AudioInfo audioInfo; VideoInfo videoInfo; RecorderInfo recorderInfo; };
?
音視頻數據的流轉如下圖,分別存在音頻和視頻數據的緩存隊列,通過 bufferavailable 來通知用戶可用 buffer,用戶可通過 acquireBuffer 和 releaseBuffer 來獲取和刪除音視頻數據
2 SoundPool
SoundPool 為音頻池管理模塊,提供集中管理多個音頻資源的功能。該框架實際并未經過媒體框架的 IPC,而是在 client 端直接調用了音頻解碼器和音頻渲染器。
SoundPool 通過 SoundIdManager 來管理 SoundParser 獲取音頻流解碼數據,通過 StreamIdManager 來管理 CacheBuffer 控制音頻流的播放,加載資源及播放的調用流程如下:
3 Monitor
媒體框架的播放及錄制 client 與 stub 分別通過繼承 MonitorClientObject,MonitorServerObject 來實現對于媒體播放錄制運行狀態的監控。client 在開始播放或者錄制后每隔 1s 向 server 端發送 click 指令,Server 端每隔 1.5s 檢查對應的 client 是否過長時間未發送指令,若出現異常,則調用暫停命令,否則調用恢復播放指令。
為了能讓大家更好的學習鴻蒙 (OpenHarmony) 開發技術,這邊特意整理了《鴻蒙 (OpenHarmony)開發學習手冊》,希望對大家有所幫助:
《鴻蒙(Harmony OS)開發學習手冊》
入門必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用開發導讀(ArKTS)
2.……
HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系統定義
2.技術框架
3.技術特性
4.系統安全
快速入門:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.構建第一個ArkTS應用
3.……
開發基礎知識:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用基礎知識
2.配置文件
3.應用數據管理
4.應用安全管理
5.應用隱私保護
6.三方應用調用管控機制
7.資源分類與訪問
8.學習ArkTS
9…
基于ArkTS 開發:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability開發
2.UI開發
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網絡與鏈接
8.電話服務
9.數據管理
10.后臺任務(Background Task)管理
11.設備管理
12.設備使用信息統計
13.DFX
14.國際化開發
15.折疊屏系列
16………
審核編輯 黃宇
-
鴻蒙
+關注
關注
59文章
2526瀏覽量
43788 -
HarmonyOS
+關注
關注
79文章
2053瀏覽量
32160
發布評論請先 登錄
直播預告丨OpenHarmony標準系統多媒體子系統之視頻解讀
OpenHarmony Camera源碼分析
OpenHarmony 3.2 Beta源碼分析之MediaLibrary
OpenHarmony 4.0 Beta1發布,邀您體驗
OpenHarmony 4.0 Beta2新版本發布,邀您體驗
OpenHarmony之NAPI框架介紹
openharmony源碼解讀
存放OpenHarmony驅動子系統源碼信息的HDF驅動框架

直播預告OpenHarmony標準系統多媒體子系統之相機解讀

基于OpenHarmony 3.2 Beta1版本的媒體能力
OpenHarmony 4.0 Beta1發布,邀您體驗
[鴻蒙]OpenHarmony4.0的Rust開發
![[鴻蒙]<b class='flag-5'>OpenHarmony4.0</b>的Rust開發](https://file1.elecfans.com/web2/M00/C1/DB/wKgaomXbKX-AAe6rAADEW5Pyw8c913.png)
OpenHarmony4.0系統修改屏幕旋轉方法,RK3566鴻蒙開發板備戰第九屆華為ICT大賽

評論