android 媒體框架之MediaCodec

一、MediaCodec 整體架構與設計思想

MediaCodec 是 Android 底層多媒體框架的核心組件,負責高效處理音視頻編解碼任務。其架構采用 生產者-消費者模型,通過雙緩沖區隊列(輸入/輸出)實現異步數據處理:

  • 輸入緩沖區隊列:存放待編碼/解碼的原始數據(如 YUV 視頻幀或 PCM 音頻)。
  • 輸出緩沖區隊列:存儲處理后的數據(如 H.264 流或解碼后的原始幀)。
  • 硬件加速支持:優先調用設備專屬編解碼器(如高通 DSP),顯著降低 CPU 負載。

二、核心組件與關鍵 API 詳解

1. 編解碼器實例(MediaCodec)
  • 創建方式
    // 創建解碼器(H.264 示例)
    MediaCodec decoder = MediaCodec.createDecoderByType("video/avc");
    // 創建編碼器(AAC 音頻示例)
    MediaCodec encoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
    
    支持通過 MIME 類型(如 video/avc)或硬件編解碼器名稱創建。
2. 緩沖區管理
  • 輸入緩沖區
    • dequeueInputBuffer(timeoutUs):獲取空閑緩沖區索引。
    • getInputBuffer(index):通過索引獲取 ByteBuffer 對象填充數據。
    • queueInputBuffer(...):提交數據給編解碼器處理。
  • 輸出緩沖區
    • dequeueOutputBuffer(BufferInfo, timeoutUs):獲取處理完成的緩沖區索引及元數據。
    • getOutputBuffer(index):讀取編解碼后數據。
    • releaseOutputBuffer(index, render):釋放緩沖區(若為視頻,render=true 可觸發渲染)。
3. 配置與狀態控制
  • 配置參數(MediaFormat)
    MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 5000000);  // 碼率
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);     // 幀率
    format.setInteger(KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible); // 顏色空間
    codec.configure(format, surface, null, 0); // surface 用于視頻渲染
    
  • 生命周期控制
    • start() → 進入運行狀態(Running)。
    • stop() → 回到未初始化狀態(Uninitialized)。
    • release() → 釋放資源。

三、核心類 MediaCodec.BufferInfo 深度解析

BufferInfo 是描述輸出緩沖區元數據的關鍵類,包含以下字段:

字段類型作用
offsetint有效數據在緩沖區中的起始偏移(字節)。通常為 0,表示從緩沖區頭部開始讀取。
sizeint有效數據長度(字節)。若為 0 且含 BUFFER_FLAG_END_OF_STREAM,表示流結束。
presentationTimeUslong呈現時間戳(微秒),用于音視頻同步(如視頻幀的渲染時機)。
flagsint緩沖區標志位(位掩碼),關鍵值包括:
(0) : B or P 幀
- BUFFER_FLAG_KEY_FRAME(1):關鍵幀(I幀)。
- BUFFER_FLAG_END_OF_STREAM(4):流結束標記(EOS)。
- BUFFER_FLAG_CODEC_CONFIG(2):編解碼配置數據(如 SPS/PPS)。

典型使用場景

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputIndex = codec.dequeueOutputBuffer(bufferInfo, timeoutUs);
if (outputIndex >= 0) {ByteBuffer outputBuffer = codec.getOutputBuffer(outputIndex);byte[] data = new byte[bufferInfo.size];outputBuffer.position(bufferInfo.offset);outputBuffer.get(data, 0, bufferInfo.size);// 關鍵幀處理if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0) {saveKeyFrame(data); // 存儲關鍵幀用于錯誤恢復}codec.releaseOutputBuffer(outputIndex, true);
}

四、工作流程與狀態機

請添加圖片描述

  • 關鍵狀態
    • Flushed:啟動后初始狀態,緩沖區為空。
    • Running:持續處理數據(90% 時間處于此狀態)。
    • End-of-Stream:輸入流結束,等待輸出剩余數據。

五、注意

  1. 同步 vs 異步模式

    • 同步模式:簡單但易阻塞主線程,適合低復雜度場景。
    • 異步模式:通過 setCallback() 監聽事件,高效但需處理線程安全。
  2. 緩沖區復用:避免頻繁申請內存,提升性能(尤其高清視頻)。

  3. 設備兼容性

    • 使用 MediaCodecList 檢查編解碼器支持情況。
    • 某些設備對 COLOR_FORMAT 支持有限,需動態適配。
  4. MediaCodec 通過雙緩沖區隊列狀態機控制實現高效編解碼,核心在于:
    緩沖區管理:dequeueInputBuffer/queueInputBufferdequeueOutputBuffer/releaseOutputBuffer 的配對使用。

  5. 元數據解析:BufferInfoflagspresentationTimeUs 是同步與錯誤恢復的關鍵。

  6. 硬件加速:優先選擇設備專屬編解碼器(如 OMX.qcom. 前綴)以優化性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82364.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Starrocks Full GC日志分析

GC日志樣例: [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

React從基礎入門到高級實戰:React 高級主題 - React 微前端實踐:構建可擴展的大型應用

React 微前端實踐:構建可擴展的大型應用 引言 在2025年的技術生態中,Web應用的規模和復雜性持續增長,微前端(Micro Frontends)已成為應對大型項目挑戰的主流架構。通過將前端應用拆分為多個獨立模塊,微前…

定時器:中央對齊模式剖析

中央對齊模式(Center-Aligned Mode)下,當配置為 模式3(CMS[1:0] 11) 時,定時器會同時觸發 上溢中斷(ARR中斷) 和 下溢中斷(0中斷),即一個PWM周期…

MySQL強化關鍵_019_索引優化

目 錄 一、最左前綴原則 1.完全使用索引 2.部分使用索引 3.不使用索引 4.效率折損 (1)使用范圍查找 (2)索引斷開 二、索引失效場景 1. 索引列參與運算 2.索引列模糊查詢以“%”開始 3.索引列是字符串類型,查…

【Oracle】安裝單實例

個人主頁:Guiat 歸屬專欄:Oracle 文章目錄 1. 安裝前的準備工作1.1 硬件和系統要求1.2 檢查系統環境1.3 下載Oracle軟件 2. 系統配置2.1 創建Oracle用戶和組2.2 配置內核參數2.3 配置用戶資源限制2.4 安裝必要的軟件包 3. 目錄結構和環境變量3.1 創建Ora…

6年“豹變”,vivo S30系列引領手機進入場景“體驗定義”時代

出品 | 何璽 排版 | 葉媛 5月29日晚,備受用戶期待的vivo S30系列如約而至。 相比前幾代S系列產品,S30系列變化顯著,堪稱“豹變”。首先,其產品打造思路發生了質變,產品體驗更好,綜合競爭力更為強。其次&a…

線性動態規劃

具有「線性」階段劃分的動態規劃方法統稱為線性動態規劃(簡稱為「線性 DP」),如下圖所示。 一、概念 如果狀態包含多個維度,但是每個維度上都是線性劃分的階段,也屬于線性 DP。比如背包問題、區間 DP、數位 DP 等都屬…

Rust 學習筆記:使用自定義命令擴展 Cargo

Rust 學習筆記:使用自定義命令擴展 Cargo Rust 學習筆記:使用自定義命令擴展 Cargo Rust 學習筆記:使用自定義命令擴展 Cargo Cargo 支持通過 $PATH 中的 cargo-something 形式的二進制文件拓展子命令,而無需修改 Cargo 本身。 …

NodeMediaEdge任務管理

NodeMediaEdge任務管理 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中,拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 在未使用NodeMediaServer的情況下,或是對部分視頻流需要單獨推送的需求,也可…

蒲公英盒子連接問題debug

1、 現象描述 2、問題解決 上圖為整體架構圖,其中左邊一套硬件設備是放在機房,右邊是放在辦公室。左邊的局域網連接了可以訪問外網的路由器,利用蒲公英作為旁路路由將局域網暴露在外網環境下。 我需要通過蒲公英作為旁路路由來進行遠程訪問&…

Golang 依賴注入:構建松耦合架構的關鍵技術

依賴注入(Dependency Injection, DI) 是一種設計模式,用于實現控制反轉(Inversion of Control, IoC),通過將依賴項的創建和管理交給外部組件,而不是在類或函數內部直接創建依賴項,從…

Transformer核心原理

簡介 在人工智能技術飛速發展的今天,Transformer模型憑借其強大的序列處理能力和自注意力機制,成為自然語言處理、計算機視覺、語音識別等領域的核心技術。本文將從基礎理論出發,結合企業級開發實踐,深入解析Transformer模型的原…

虛擬線程與消息隊列:Spring Boot 3.5 中異步架構的演進與選擇

企業級開發領域正在經歷一場翻天覆地的巨變,然而大多數開發者卻對此渾然不覺,完全沒有意識到。Spring Boot 3.5 帶來的革命性的虛擬線程 (Virtual Threads) 和增強的響應式能力,絕不僅僅是小打小鬧的增量改進——它們正在從根本上改變我們對異…

網絡編程(計算機網絡基礎)

認識網絡 1.網絡發展史 ARPnetA(阿帕網)->internet(因特網)->移動互聯網->物聯網 2.局域網與廣域網 局域網 概念:的縮寫是LAN(local area network),顧名思義,是個本地的網絡,只能實現小范圍短距…

Windows Server部署Vue3+Spring Boot項目

在Windows Server 上部署Vue3 Spring Boot前后端分離項目的詳細步驟如下: 一、環境準備 安裝JDK 17 下載JDK MSI安裝包(如Oracle JDK 或 OpenJDK) 雙擊安裝,配置環境變量: JAVA_HOME:JDK安裝路徑&#xf…

CCF CSP 第37次(2025.03)(3_模板展開_C++)(哈希表+stringstream)

CCF CSP 第37次(2025.03)(3_模板展開_C) 解題思路:思路一(哈希表stringstream): 代碼實現代碼實現(思路一(哈希表stringstream))&…

數據安全管理進階:81頁 2024數據安全典型場景案例集【附全文閱讀】

《2024 數據安全典型場景案例集》聚焦政務數據安全,覆蓋數據細粒度治理、授權運營、接口安全、系統接入、批量數據共享、使用側監管、風險監測、賬號管控、第三方人員管理、密碼應用等十大典型場景,剖析各場景風險并提供技術方案,如基于 AI 的…

Leetcode 261. 以圖判樹

1.題目基本信息 1.1.題目描述 給定編號從 0 到 n - 1 的 n 個結點。給定一個整數 n 和一個 edges 列表,其中 edges[i] [ai, bi] 表示圖中節點 ai 和 bi 之間存在一條無向邊。 如果這些邊能夠形成一個合法有效的樹結構,則返回 true ,否則返…

【ISAQB大綱解讀】LG 1-8:區分顯性陳述和隱性假設(R1)

軟件架構師: 應明確提出假設或先決條件,從而防止隱性假設 知道隱性假設可能會導致利益相關方之間的潛在誤解 1. 應明確提出假設或先決條件,防止隱性假設 為什么重要? 隱性假設是架構風險的溫床 例如:假設“所有服務都…

IT運維工具的選擇標準有哪些?

選擇IT運維工具時,可參考以下標準,確保工具適配業務需求且高效易用: 1. 明確業務需求與場景 ? 核心目標:根據運維場景(如監控、自動化、安全等)匹配工具功能。例如,監控大規模集群選Promethe…