1 概述
介绍如何使用HarmonyOS NEXT自带的OHAudio音频模块开发音频播放和录音功能
2 依赖
在CMake脚本中链接动态库
添加头文件
3 音频播放
音频播放开发流程
一个简单的OHAudio播放流程如下:
- 创建Renderer(设置streamBuilder参数等)
- 设置RendererCallback
- 状态控制
- 资源释放
第一步:创建Renderer
第二步:设置RendererCallback
设置的回调方法通过OH_AudioStreamBuilder_SetRendererCallback接口绑定到StreamBuilder。
第三步:状态控制
第四步:释放Renderer等对象
音频播放状态控制
音频播放状态控制如下图:
开发过程中常见问题
低时延模式支持
开启低时延模式后,支持的音频采样率为48Khz或是96Khz.若播放音频的采样率不满足要求,可能出现杂音。
OH_AudioRenderer_OnWriteData回调函数中bufferLen如何调整
可通过OH_AudioStreamBuilder_SetFrameSizeInCallback()设置,其中frameSize和bufferLen换算规则如下:
OHAudio播放暂停延迟问题如何分析
播放暂停延迟问题一般为OH_AudioRenderer_OnWriteData回调函数中设置的bufferLen过大导致,一般可以在日志中见到如下内容:
这种情况的解决方法需要将bufferLen调小。或是优化OH_AudioRenderer_OnWriteData中逻辑。减少一次回调所需时间。正常情况一次回调时间需控制在3000us之内。
OHAudio播放打断及恢复
在通话、短信通知或是闹铃等高优先级音频响起时,OHAudio会被打断,随后等待这些音频结束后,恢复OHAudio音频播放。需要实现上述效果需要通过OH_AudioRenderer_OnInterruptEvent实现。实现方式如下:
使用播放过程中如何修改使用场景
场景:语言通话功能,切换听筒(AUDIOSTREAM_USAGE_VOICE_COMMUNICATION)和扬声器(AUDIOSTREAM_USAGE_VIDEO_COMMUNICATION)OH_AudioStreamBuilder_SetRendererInfo接口用于设置音频使用场景,但是在Renderer创建完成之后,已创建的Renderer的使用场景便不可以修改(目前无可调整接口),需要重新生成一个不同场景的Renderer替换之前的Renderer。
音频文件播放完毕之后能否自动改变Renderer状态为stop
不能,Renderer只能一个播放通道,并没有播放资源完成的概念。需要手动控制,如Renderer长时间不stop可能存在功耗问题。
4 音频录制
音频录制开发流程
音频录制开发流程和音频播放开发流程基本上一致:
- 创建Capturer(设置streamBuilder参数等)
- 设置CapturerCallback
- 状态控制
- 资源释放
第一步:创建Capturer
第二步:设置CapturerCallback
第三步:状态控制
第四步:资源释放
开发过程中常见问题
创建Capturer不成功
音频录制功能需要依赖手机的麦克风,如需使用麦克风需要提前申请权限ohos.permission.MICROPHONE。未申请麦克风权限的情况下OH_AudioStreamBuilder_GenerateCapturer接口不会报错和闪退,但是OH_AudioStreamBuilder_GenerateCapturer接口返回值不是AUDIOSTREAM_SUCCESS。需要通过该返回值来判断Capturer是否创建成功,避免Capturer创建不成功导致调用野指针(Capturer)的方法出现的不可预测问题。
连接耳机时,不想使用耳机麦克风进行收音如何调整
OH_AudioStreamBuilder_SetCapturerInfo接口设置为AUDIOSTREAM_SOURCE_TYPE_VOICE_COMMUNICATION时,使用的时耳机麦克风收音,其他配置均使用机器本身的麦克风收音。
5 参考文档
原文链接:华为开发者文章
更多问题可关注:
鸿蒙游戏官方网站:已有游戏移植-鸿蒙游戏-华为开发者联盟
公开课:华为开发者学堂