背景
应用开发过程中很多场景都有音频采集需求,比如聊天功能的发送语音功能,实时语音转文本功能,实时语音通话,实时视频通话等。在Android和iOS端,系统提供了两种形式:
- 实时音频流采集
- 音频文件录制
系统还提供了不同形式的API,比如Android:
- AudioRecorder Java接口
- MediaRecorder Java接口
- OpenSLES C++接口
- AAudio C++接口
在鸿蒙化适配的过程中也有音频采集的需求,本文我们一步一步实现音频采集功能。
若大家觉得看文章不过瘾,可以去B站看音视频开发视频教程,给大家整理了一个几十小时的视频教程合集(内含:FFmpeg、RTSP、RTMP、SRS流媒体服务器、编解码、推拉流、音视频通话等项目实战教程),还有配套课件资料给大家哦。↓↓↓见下面↓↓点击↓↓
音频录制接口介绍
HarmonyOS 提供了TS与C++两种音频采集接口:
- AudioCapture
- OHAudio
分别介绍这两种语言的API。
AudioCapture
使用AudioCapturer录制音频涉及到AudioCapturer实例的创建、音频采集参数的配置、采集的开始与停止、资源的释放等,下面官方给出的状态示意图将方法和状态切换标记的很清晰:
createAudioCapture
创建capture主要涉及到参数配置:
参数包含两大块:
- AudioStreamInfo:音频格式配置信息
samplingRate:采样率
channels:声道数
sampleFormat:采样格式
encodingType:音频编码类型,目前只支持PCM的ENCODING_TYPE_RAW配置
on(‘readData’)
on(‘readData’)方法用来订阅监听音频数据读入回调:
- AudioCapturerInfo:采集配置信息
SOURCE_TYPE_INVALID:无效的音频源
SOURCE_TYPE_MIC:Mic音频源
SOURCE_TYPE_VOICE_RECOGNITION:语音识别源
SOURCE_TYPE_PLAYBACK_CAPTURE:播放音频流(内录)录制音频源
SOURCE_TYPE_VOICE_COMMUNICATION:语音通话场景的音频源
SOURCE_TYPE_VOICE_MESSAGE:短语音消息的音频源
source:音源类型,包含:capturerFlags:音频采集器标志,0代表音频采集器
on(‘readData’)
on(‘readData’)方法用来订阅监听音频数据读入回调:
start
start方法用来开始录制:
stop
stop用来停止录制:
release
release销毁实例,释放资源
OHAudio
OHAudio是系统在API version 10中引入的一套C API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输入功能的场景。很多音频编码库都是C/C++实现的,在迁移到鸿蒙平台后,采集侧也使用OHAudio C++接口,可以减少数据在TS层与C++层传递的消耗,提高效率。
OHAudio依赖libohaudio.so动态库,通过引入<native_audiostreambuilder.h>和<native_audiocapturer.h)>头文件,使用音频录制相关API。
创建构造器
配置音频流参数
可参考如下示例:
参数作用于AudioCapture类似。
设置音频回调函数
通过OH_AudioStreamBuilder_SetCapturerCallback函数配置回调函数。
构造录制音频流
使用音频流
- OH_AudioStream_Result OH_AudioCapturer_Start(OH_AudioCapturer* capturer):开始录制
- OH_AudioStream_Result OH_AudioCapturer_Pause(OH_AudioCapturer* capturer):暂停录制
- OH_AudioStream_Result OH_AudioCapturer_Stop(OH_AudioCapturer* capturer):停止录制
- OH_AudioStream_Result OH_AudioCapturer_Flush(OH_AudioCapturer* capturer):释放缓存数据
- OH_AudioStream_Result OH_AudioCapturer_Release(OH_AudioCapturer* capturer):释放录制实例
释放构造器
音频录制最佳实践
我们以录制MP3为例来实现音频采集的全流程实践。
权限申请
音频采集需要动态申请权限,现在module.json5中声明权限:
动态申请权限:
在aboutToAppera中调用申请权限方法,在授权成功后启动录音
配置C++项目
创建C++模块后,配置ohaudio动态库依赖:
配置napi方法:
实现启动录制
最佳实践一:
为了避免不可预期的行为,在设置音频回调函数时,请确保OH_AudioCapturer_Callbacks的每一个回调都被自定义的回调方法或空指针初始化,比如:
最佳实践二:
对于支持低延时模式的设备,对于延时要求比较高的场景(比如语音通话)可以使用低时延模式创建音频录制构造器,获得更高质量的音频体验:
音频文件处理
在音频回调中我们对音频数据就行处理,可以交给ASR也可以直接写入文件,下一篇我们实现编码成mp3并写入文件的实践。
停止播放销毁实例
总结
本文介绍了HarmonyOS 提供的两种音频采集方式:TS层的AudioCapture和C++层的OHAudio,并以OHAudio接口实现了实时音频采集功能。