实现Audio Vivid空间音频编码、解码、播放
介绍
本示例基于AVCodec Kit的能力,对一个内置的4通道PCM,做2声道声床与2对象的Audio Vivid空间音频编码,编码过程中,可在界面设置对象的位置及增益,将对象位置元数据及音频PCM实时编码为Audio Vivid码流, 再将码流经过Audio Vivid解码和渲染,渲染后可感受码流经过空间音频编码及渲染的效果,展示了Audio Vivid编码、解码、渲染的实现,结合耳机体验更佳。
效果图预览
图1:主界面

- 点击'开始播放'按钮,即可实现编码、解码、渲染的全流程。点击后,按钮会变为停止播放。
- 点击'停止播放'按钮,即可实现停止demo的演示。
- 开始播放后,拖动对象的正视图或俯视图的位置,即可感受实时渲染的对象方位。
- 开始播放后,拖动对象的增益控制条,即可感受对象渲染时的音量变化。
工程结构&模块类型
entry/src/main
├─cpp
│ │ AudioConfig.h
│ │ AudioLog.h
│ │ AudioRenderWrapper.cpp // Audio Vivid渲染
│ │ AudioRenderWrapper.h
│ │ AudioVividDecoder.cpp // Audio Vivid解码
│ │ AudioVividDecoder.h
│ │ AudioVividEncoder.cpp // Audio Vivid编码
│ │ AudioVividEncoder.h
│ │ AudioVividPlaybackManager.cpp // Demo应用元数据构造、编码、解码、渲染管理
│ │ AudioVividPlaybackManager.h
│ │ AudioVividWrapper.cpp // Audio Vivid元数据构造,更新元数据中的对象位置
│ │ AudioVividWrapper.h
│ │ CMakeLists.txt
│ │ napi_init.cpp // NAPI接口声明
│ │ PCMFileReader.cpp // PCM文件读取
│ │ PCMFileReader.h
│ │
│ └─types
│ └─libentry
│ Index.d.ts
│
├─ets
│ │ AudioVividManager.ets // 位置更新与元数据联动接口
│ │ PositionView.ets // 位置更新UI
│ └─pages
│ Index.ets // 主界面
│
└─resources
└─resfile
2ch_2obj_48k_24bit.pcm // 内置的4通道PCM,前2通道为立体声声床,后2通道分别为2个对象
具体实现
使用AVCodec Kit实现Audio Vivid空间音频编码、解码、渲染功能
- 源码参考:
- 应用管理:AudioVividPlaybackManager.cpp
- Audio Vivid编码:AudioVividEncoder.cpp
- Audio Vivid元数据构造:AudioVividWrapper.cpp
- Audio Vivid解码:AudioVividDecoder.cpp
- Audio Vivid渲染:AudioRenderWrapper.cpp
- 使用流程:
- 点击'开始播放'按钮,首先调用
Initialize方法初始化播放管理器,包括打开PCM文件、创建编码器、解码器和渲染器。 - 编码器创建与配置:调用
OH_AudioCodec_CreateByMime创建Audio Vivid编码器,通过OH_AudioCodec_Configure配置编码参数(采样率、声道数、声道布局、比特率等),使用OH_AudioCodec_RegisterCallback注册编码器回调函数(错误回调、格式变化回调、输入缓冲区回调、输出缓冲区回调),最后调用OH_AudioCodec_Prepare和OH_AudioCodec_Start启动编码器。 - 元数据更新:通过
OH_AudioVividMetaBuilder_Create创建元数据构造器,拖动对象位置时,通过OH_AudioVividMetaBuilder_UpdateObjectPos更新元数据中的对象位置,拖动增益控制条时,使用OH_AudioVividMetaBuilder_UpdateObjectGain更新元数据中的对象渲染增益,调用OH_AudioVividMetaBuilder_GetMeta方法可获取当前的元数据buffer。 - 解码器创建与配置:调用
OH_AudioCodec_CreateByMime创建Audio Vivid解码器,通过OH_AudioCodec_Configure配置解码参数,使用OH_AudioCodec_RegisterCallback注册解码器回调函数,最后调用OH_AudioCodec_Prepare和OH_AudioCodec_Start启动解码器。 - 渲染器创建与配置:调用
OH_AudioStreamBuilder_Create创建音频流构建器,设置采样率、声道数、声道布局、采样格式、渲染器信息和编码类型为Audio Vivid,通过OH_AudioStreamBuilder_SetRendererCallback设置渲染器回调,使用OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback设置带元数据的写入数据回调,最后调用OH_AudioStreamBuilder_GenerateRenderer和OH_AudioRenderer_Start启动渲染器。 - 编码流程:从PCM文件读取音频数据,通过
OH_AudioCodec_PushInputBuffer将PCM数据和元数据推送到编码器,编码器通过回调函数输出编码后的Audio Vivid码流。 - 解码流程:将编码器输出的码流通过
OH_AudioCodec_PushInputBuffer推送到解码器,解码器通过回调函数输出解码后的PCM数据和元数据。 - 渲染流程:解码器输出的PCM数据和元数据通过回调函数传递给渲染器,渲染器将数据写入音频输出设备,实现空间音频的渲染播放。
- 点击'停止播放'按钮,调用
Stop方法停止编码器、解码器和渲染器,释放相关资源。
- 点击'开始播放'按钮,首先调用
相关权限
不涉及。
模块依赖
不涉及。
约束与限制
-
本示例仅支持在标准系统上运行,仅支持华为设备。
-
本示例支持API version 26.0.0。
-
高等级APL特殊签名说明:无。