赞
踩
AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音频数据,适合有音频开发经验的开发者实现更灵活的录制功能。
使用AudioCapturer录制音频涉及到AudioCapturer实例的创建、音频采集参数的配置、采集的开始与停止、资源的释放等。该篇文章将以一次录制音频数据的过程为例,讲解如何使用AudioCapturer进行音频录制,建议搭配AudioCapturer的API说明阅读。
1、音频渲染器的配置
- private audioRendererInfo: audio.AudioRendererInfo = {
- usage: audio.StreamUsage.STREAM_USAGE_MOVIE, // 播放类型,MUSIC 表示用喇叭播放,MOVIE 也是喇叭播放,但是不容易卡顿
- rendererFlags: 0
- };
2、创建音频渲染器实例、配置录音权限
- // 音频渲染器实例
- private audioRenderer: audio.AudioRenderer | null = null
- // 录音权限
- private permissions: Permissions[] = ["ohos.permission.MICROPHONE"]
3、音频流配置
- private audioStreamInfo: audio.AudioStreamInfo = {
- samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
- channels: audio.AudioChannel.CHANNEL_2, // 通道
- sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
- encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
- };
4、音频采集器配置
- private audioCapturerInfo: audio.AudioCapturerInfo = {
- source: audio.SourceType.SOURCE_TYPE_MIC,
- capturerFlags: 0
- };
5、音频采集器实例化、定义文件路径、创建时间
- // 音频采集器实例
- private audioCapturer: audio.AudioCapturer | null = null
- // 录音文件路径
- private filePath: string = ''
- // 录音创建时间
- private date_added: number = 0
6、录音权限获取
- // 初始化权限
- async requestPermissions() {
- // 申请权限
- const isAuth = await permissionManager.requestPermissions(this.permissions)
- // 如果未授权引导去设置页开启授权
- if (isAuth === false) {
- // 未开启弹窗提示
- const dialogRes = await promptAction.showDialog({
- alignment: DialogAlignment.Center,
- title: '温馨提示',
- message: '录音功能需要获取权限,请在系统设置中打开麦克风开关',
- buttons: [
- { text: '取消', color: $r('app.color.font_sub') },
- { text: '立即开启', color: $r('app.color.brand') }
- ]
- })
- // 打开设置页
- if (dialogRes.index === 1) {
- permissionManager.openPermissionSettingsPage()
- }
- }
- }

7、获取录音采集器实例
- // 获取音频采集器实例
- async getAudioCapturer() {
- // 如果已经存在,直接返回
- if (this.audioCapturer) {
- return this.audioCapturer
- }
- // 创建音频采集器
- const audioCapturer = await audio.createAudioCapturer({
- streamInfo: this.audioStreamInfo,
- capturerInfo: this.audioCapturerInfo
- })
- // 保存方便下次直接获取
- this.audioCapturer = audioCapturer
- // 返回音频采集器
- return audioCapturer
- }

8、开始录音
- // 开始录音
- async startCapturer(filePath: string) {
- // 根据 filePath 打开文件,可读可写模式,如果文件不存在自动创建
- const file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
- // 1. 获取音频采集器
- const audioCapturer = await this.getAudioCapturer()
- // 偏移值
- let bufferSize: number = 0
- // 2. 调用on('readData')方法,订阅监听音频数据读入回调
- audioCapturer.on('readData', (buffer) => {
- // 把采集的音频信息写入到打开的文件中
- fileIo.writeSync(file.fd, buffer, { offset: bufferSize, length: buffer.byteLength })
- // 累加偏移值
- bufferSize += buffer.byteLength
- // 测试用的,封装完成记得删除
- promptAction.showToast({ message: bufferSize.toString() })
- })
- // 3. 开始录音采集
- audioCapturer.start()
- // 保存录音文件路径
- this.filePath = filePath
- // 保存录音创建时间
- this.date_added = Date.now()
- }

9、结束录音
- async stopCapturer(): Promise<AudioInfo> {
- // 获取音频采集器
- const audioCapturer = await this.getAudioCapturer()
- await audioCapturer.stop() // 停止采集
- audioCapturer.release() // 释放资源
- this.audioCapturer = null // 重置采集器变量
- // 返回录音文件关键信息
- return {
- filePath: this.filePath, // 文件路径
- date_added: this.date_added, // 创建时间
- duration: Date.now() - this.date_added // 持续时长
- }
- }
10、定义音频渲染器
- // 获取音频渲染器(播放器)
- async getAudioRenderer() {
- if (this.audioRenderer) {
- return this.audioRenderer
- }
- this.audioRenderer = await audio.createAudioRenderer({
- streamInfo: this.audioStreamInfo,
- rendererInfo: this.audioRendererInfo
- })
- return this.audioRenderer
- }
11、播放录音
- // 播放录音
- async startRenderer(filePath: string) {
- // 根据路径打开文件
- const file = fileIo.openSync(filePath)
- // 获取文件信息,如果读取时已经超出文件大小,自动停止
- const stat = fileIo.statSync(file.fd)
- // 1. 获取音频渲染器(播放器)
- const audioRenderer = await this.getAudioRenderer()
- // 偏移值
- let bufferSize: number = 0
- // 2. 调用on('writeData')方法,订阅监听音频数据写入回调
- audioRenderer.on('writeData', async (buffer) => {
- fileIo.readSync(file.fd, buffer, { offset: bufferSize, length: buffer.byteLength })
- bufferSize += buffer.byteLength
- // 测试用的,封装完成记得删除
- promptAction.showToast({ message: bufferSize.toString() })
- if (bufferSize >= stat.size) {
- // 停止渲染器(播放器)
- await audioRenderer.stop() // 停止
- audioRenderer.release() // 释放资源
- this.audioRenderer = null // 清理变量
- }
- })
- // 3. 启动音频渲染器(播放器)
- audioRenderer.start()
- }

12、停止播放录音
- // 停止播放录音
- async stopRenderer() {
- // 获取音频渲染器(播放器)
- const audioRenderer = await this.getAudioRenderer()
- if (
- audioRenderer.state === audio.AudioState.STATE_RUNNING
- ||
- audioRenderer.state === audio.AudioState.STATE_PAUSED
- ) {
- await audioRenderer.stop() // 停止
- audioRenderer.release() // 释放资源
- this.audioRenderer = null // 清理变量
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。