录制音频
配置文件
在调用手机麦克风时,需要在module.json5文件中进行声明权限
{
"name":"ohos.permission.MICROPHONE",
"usedScene": {},
//申请原因描述,在string.json中进行配置
"reason":"$string:EntryAbility_desc"
}
完成声明权限后,还需向用户申请使用权限,若用户禁止使用麦克风,引导用户进行二次授权
import { abilityAccessCtrl, common, Want } from '@kit.AbilityKit'
const atManager = abilityAccessCtrl.createAtManager()
const result = await atManager.requestPermissionsFromUser(
getContext(),
['ohos.permission.MICROPHONE']
)
if(result.authResults[0] == -1){
const want: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
// 修改成你的应用包名,跳转到该应用的设置页面
pushParams: 'com.example.test'
}
}
const uiContext = getContext() as common.UIAbilityContext
// 调起手机设置中的当前应用设置面板
uiContext.startAbility(want)
}
录制流程及实现
- 开始录制
- 获取到文件保存的地址,并设置文件打开模式,若没有改文件则创建文件,然后以读写模式打开
- 配置录音文件配置对象,将url属性设置为文件保存地址
- 使用media.createAVRecorder()创建录音对象,并设置录音参数,使用start()方法开始录音
- 结束录制
- 使用stop()方法停止音频录制
- 使用release()方法销毁录音对象,释放空间
当成功录制后可在应用目录中查看到所保存的文件名称和文件大小
具体代码实现如下:
import fs from '@ohos.file.fs';
import { media } from '@kit.MediaKit'
export class recordAudioManager{
//存储录音对象
static avRecorder: media.AVRecorder
//开始录音
static async startRecord(){
//获取文件保存地址
recordAudioManager.filePath = getContext().filesDir + '/' + Date.now() + '.m4a'
//打开文件保存地址并设置文件打开模式
const file = fs.openSync(recordAudioManager.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
//准备录音文件配置对象
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}` //文件地址
}
//创建录音对象
recordAudioManager.avRecorder = await media.createAVRecorder()
//设置录制参数
await recordAudioManager.avRecorder.prepare(config)
//开始录制
await recordAudioManager.avRecorder.start()
}
//停止录音
static async stopRecord(){
//判断是否存在录制对象
if (recordAudioManager.avRecorder){
//停止录制
recordAudioManager.avRecorder.stop()
//销毁录制对象,释放空间
recordAudioManager.avRecorder.release()
}
}
}
播放音频
- 开始播放
- 调用后传入所要播放的文件地址
- 首先定义播放对象
- 将参数中的播放地址传入播放对象
- 使用on()方法监听播放对象的状态变化,当状态发生变化时,触发回调函数进行播放
- 停止播放
- 使用stop()方法停止播放
具体代码实现如下:
import { media } from '@kit.MediaKit'
play: media.AVPlayer = Object()
async playAudio(url: string){
//定义播放对象
this.play = await media.createAVPlayer()
//判断播放对象状态,当状态改变时触发回调函数
this.play.on( "stateChange",(state)=>{
//播放对象初始化完成后,进入准备播放状态
if(state == 'initialized') this.play.prepare()
//播放对象准备完成后,开始播放
if(state == 'prepared'){
//开启循环播放
this.play.loop = true
//开始播放
this.play.play()
}
})
//设置播放文件地址
this.play.url = url
}
stopAudio(){
//停止播放
this.play.stop()
}