应用场景
在一些应用中,我们可能需要用到录音功能,记录用户的对话,阅读,或者唱歌。不过录音需要用到麦克风权限。在上一篇文章中,我们已经通过封装的通用权限工具,获取到了麦克风的权限,如果不清除可以点击跳转
核心API
使用 AvRecorder 实现音频录制存储到应用沙箱。
下面是一个简单的录制流程,不考虑暂停或重录。
准备页面结构
这里准备两个按钮,一个用来开始录制,一个用来结束录制,用轻提示提醒录制开始或结束。
// 开始录制方法
startRecord() {
}
// 停止录制方法
stopRecord() {
}
build() {
Column({ space: 10 }) {
Button('开始录制')
.onClick(() => {
this.startRecord()
promptAction.showToast({ message: '开始录制' })
})
Button('停止录制')
.onClick(() => {
this.stopRecord()
promptAction.showToast({ message: '停止录制' })
})
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
录制方法步骤
现在我们实现这两个方法
avRecorder?: media.AVRecorder
fd?: number
filePath?: string
// 开始录制方法
async startRecord() {
// 1. 准备一个文件接收录音
const ctx = getContext(this)
// 创建一个唯一的文件路径
const filePath = ctx.filesDir + '/' + Date.now() + '.m4a'
this.filePath = filePath
// 借助 fileIo 创建或打开这个文件
const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
// 记录文件的 fd,用来关闭文件
this.fd = file.fd
// 2. 准备录音配置对象 基本固定写法
const config: media.AVRecorderConfig = {
audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
profile: {
audioBitrate: 100000, // 音频比特率
audioChannels: 1, // 音频声道数
audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac
audioSampleRate: 48000, // 音频采样率
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a
},
url: `fd://${file.fd}`
}
// 3. 开始录制
const avRecorder = await media.createAVRecorder()
// 等待 prepare 完成
await avRecorder.prepare(config)
// 开始录制
await avRecorder.start()
// 记录 avRecorder,用来停止录制和释放
this.avRecorder = avRecorder
}
// 停止录制方法
async stopRecord() {
// 判断是否有 正在录制
if (this.avRecorder) {
// 停止录制
await this.avRecorder.stop()
// 释放 avRecorder 和 关闭文件
await this.avRecorder.release()
fileIo.closeSync(this.fd)
}
}
然后就可以点击开始录制,录制一段时间和点击停止,会产出一个文件,找到该文件的具体方法是如下。将该文件保存在桌面,可以使用播放器播放。
包名就是你创建项目的时候定义的。
保存到电脑上
可以暂时保存到桌面,当然这是随意的。
点击即可播放
好的,下一篇文章我们再给录音组件做一个可视化的振幅,可以根据声音的大小来实时变化。