以下是对鸿蒙音频解码模块的总结,包含核心流程、API设计与使用要点,以及Mermaid示意图:
一、鸿蒙音频解码核心流程
以下内容基于官方文档,用一张 Mermaid 时序图 把「鸿蒙音频解码(AVCodec Kit)」的核心流程、API 设计与使用要点一次性梳理出来。可直接复制到 mermaid.live 预览。
仅保留开发者最常调用的接口与顺序,省略了可选项与异常分支,方便快速上手。
-
支持的输入格式
AAC、FLAC、MP3、Vorbis、G711、AMR、APE、Opus、Audio Vivid 等,具体采样率/声道范围见文档表格。
-
PCM 输出格式
通过
OH_MD_KEY_AUDIO_SAMPLE_FORMAT
可选SAMPLE_S16LE
或SAMPLE_F32LE
,默认 S16LE。 -
线程模型
所有回调都在内部工作线程,请勿阻塞;应用需要保证线程安全。
-
DRM 解密
若内容加密,需在
Prepare
前调用OH_AudioCodec_SetDecryptionConfig
,并在PushInputBuffer
时把 cencInfo 通过OH_AVCencInfo_SetAVBuffer
写入。 -
EOS 处理
输入最后一包数据时把 flags 设为
AVCODEC_BUFFER_FLAGS_EOS
,解码器会在回调中同样给出 EOS,应用即可进入停止流程。 -
CMake 链接
scss
target_link_libraries(xxx
native_media_codecbase.so
)
一句话总结
「鸿蒙音频解码」遵循 创建→配置→启动→循环喂数据→取 PCM→停止销毁 的极简五步模型;所有细节都围绕 OH_AVCodec*
句柄与 4 个回调完成,无需额外线程或同步,直接嵌入现有播放 / 编辑管线即可。

二、API设计与使用要点
1. 核心API组件
组件类型 | 关键API | 作用说明 |
---|---|---|
解码器实例 | OH_AudioCodec_CreateByMime() |
通过MIME类型创建解码器 |
OH_AudioCodec_CreateByName() |
通过编解码器名称创建 | |
回调注册 | OH_AudioCodec_RegisterCallback() |
注册错误/数据流/缓冲区回调 |
参数配置 | OH_AudioCodec_Configure() |
设置采样率/声道数等参数 |
运行时控制 | OH_AudioCodec_Start() |
启动解码器 |
OH_AudioCodec_Flush() |
刷新缓冲区(可选) | |
OH_AudioCodec_Reset() |
重置解码器(可选) | |
数据操作 | OH_AudioCodec_PushInputBuffer() |
送入压缩数据 |
OH_AudioCodec_FreeOutputBuffer() |
释放PCM输出数据 | |
资源管理 | OH_AudioCodec_Destroy() |
销毁解码器实例 |
2. 关键开发步骤
-
创建实例
ini// 通过MIME创建 OH_AVCodec *decoder = OH_AudioCodec_CreateByMime(OH_AVCODEC_MIMETYPE_AUDIO_AAC, false); // 或通过名称创建 const char *name = OH_AVCapability_GetName(capability); OH_AVCodec *decoder = OH_AudioCodec_CreateByName(name);
-
注册回调
iniOH_AVCodecCallback cb = {OnError, OnOutputFormatChanged, OnInputBufferAvailable, OnOutputBufferAvailable}; OH_AudioCodec_RegisterCallback(decoder, cb, userData);
-
配置参数
scssOH_AVFormat *format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); OH_AudioCodec_Configure(decoder, format);
-
**数据流处理
-
输入 :在
OnInputBufferAvailable
回调中填充压缩数据scssOH_AVBuffer_SetBufferAttr(buffer, &attr); // 设置PTS/flag等属性 OH_AudioCodec_PushInputBuffer(decoder, index);
-
输出 :在
OnOutputBufferAvailable
中获取PCM数据scssOH_AVBuffer_GetBufferAttr(data, &attr); // 获取解码数据属性 OH_AudioCodec_FreeOutputBuffer(decoder, index); // 释放缓冲区
-
3. 特殊功能支持
-
DRM解密
scssOH_AudioCodec_SetDecryptionConfig(decoder, session, false); OH_AVCencInfo_SetAVBuffer(cencInfo, buffer); // 设置加密信息
-
Audio Vivid元数据
scssOH_AVFormat_GetBuffer(format, OH_MD_KEY_AUDIO_VIVID_METADATA, &metadata, &metaSize);
三、重要注意事项
-
调用顺序强制要求:
创建 → 配置 → 准备 → 启动
必须顺序执行,否则引发异常 -
解码格式限制:
- 支持AAC/FLAC/MP3/Vorbis等主流格式
- 不同格式有特定参数要求(如Vorbis需ID Header)
-
资源释放:
scssOH_AudioCodec_Stop(decoder); // 先停止 OH_AudioCodec_Destroy(decoder); // 再销毁
-
动态库依赖:
scsstarget_link_libraries(sample libnative_media_codecbase.so libnative_media_core.so libnative_media_acodec.so)
文档链接 : 音频解码-音视频编解码-AVCodec Kit(音视频编解码服务)-媒体 - 华为HarmonyOS开发者