使用 AvRecorder 录音
实现步骤:
- 需要一个文件接收音频数据
- 准备录音配置
- 使用 AvRecorder 实现开始录音,结束录音
avRecorder?: media.AVRecorder
fd?: number
filePath?: string
// 开始录音
async startRecord() {
// 1. 准备一个文件接收录音
const ctx = getContext(this)
const filePath = ctx.filesDir + '/' + Date.now() + '.m4a'
this.filePath = filePath
const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
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()
await avRecorder.prepare(config)
await avRecorder.start()
this.avRecorder = avRecorder
}
// 结束录音
async stopRecord() {
if (this.avRecorder) {
await this.avRecorder.stop()
await this.avRecorder.release()
fileIo.closeSync(this.fd)
}
}
// 实现方法,控制录音的开关
Button('开始录音')
.onClick(() => {
this.startRecord()
})
Button('结束录音')
.onClick(() => {
this.stopRecord()
})
使用 AvPlayer 播放
能够使用 AvPlayer 播放应用沙箱中的音频文件,且显示进度条
avPlayer?: media.AVPlayer
@State total: number = 0
@State value: number = 0
async startPlay() {
try {
const file = fileIo.openSync(this.filePath, fileIo.OpenMode.READ_ONLY)
const avPlayer = await media.createAVPlayer()
avPlayer.on('stateChange', state => {
if (state === 'initialized') {
avPlayer.prepare()
} else if ( state === 'prepared') {
avPlayer.loop = true
this.total = avPlayer.duration
avPlayer.play()
}
})
// 当前播放时间改变
avPlayer.on('timeUpdate', (time) => {
this.value = time
})
avPlayer.url = `fd://${file.fd}`
this.avPlayer = avPlayer
} catch (e) {
logger.error('startPlay', JSON.stringify(e))
}
}
stopPlay() {
if (this.avPlayer) {
this.avPlayer.stop()
this.avPlayer.release()
}
}
// 实现方法
Button('开始播放')
.onClick(() => {
this.startPlay()
})
Button('停止播放')
.onClick(() => {
this.stopPlay()
})
Progress({ total: this.total, value: this.value })
.width('100%')