README.md

实现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空间音频编码、解码、渲染功能

  • 源码参考:
  • 使用流程:
    • 点击'开始播放'按钮,首先调用Initialize方法初始化播放管理器,包括打开PCM文件、创建编码器、解码器和渲染器。
    • 编码器创建与配置:调用OH_AudioCodec_CreateByMime创建Audio Vivid编码器,通过OH_AudioCodec_Configure配置编码参数(采样率、声道数、声道布局、比特率等),使用OH_AudioCodec_RegisterCallback注册编码器回调函数(错误回调、格式变化回调、输入缓冲区回调、输出缓冲区回调),最后调用OH_AudioCodec_PrepareOH_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_PrepareOH_AudioCodec_Start启动解码器。
    • 渲染器创建与配置:调用OH_AudioStreamBuilder_Create创建音频流构建器,设置采样率、声道数、声道布局、采样格式、渲染器信息和编码类型为Audio Vivid,通过OH_AudioStreamBuilder_SetRendererCallback设置渲染器回调,使用OH_AudioStreamBuilder_SetWriteDataWithMetadataCallback设置带元数据的写入数据回调,最后调用OH_AudioStreamBuilder_GenerateRendererOH_AudioRenderer_Start启动渲染器。
    • 编码流程:从PCM文件读取音频数据,通过OH_AudioCodec_PushInputBuffer将PCM数据和元数据推送到编码器,编码器通过回调函数输出编码后的Audio Vivid码流。
    • 解码流程:将编码器输出的码流通过OH_AudioCodec_PushInputBuffer推送到解码器,解码器通过回调函数输出解码后的PCM数据和元数据。
    • 渲染流程:解码器输出的PCM数据和元数据通过回调函数传递给渲染器,渲染器将数据写入音频输出设备,实现空间音频的渲染播放。
    • 点击'停止播放'按钮,调用Stop方法停止编码器、解码器和渲染器,释放相关资源。

相关权限

不涉及。

模块依赖

不涉及。

约束与限制

  1. 本示例仅支持在标准系统上运行,仅支持华为设备。

  2. 本示例支持API version 26.0.0。

  3. 高等级APL特殊签名说明:无。