功能介绍:
播音音频,提高音频文件路径,播放音频。参考文档使用AVPlayer开发音频播放功能。
知识点:
- 熟悉使用AVPlayer音视频播放器。
- 读取应用文件夹的本地音频文件。
- 加载并播放音频。
使用环境:
- API 9
- DevEco Studio 4.0 Release
- Windows 11
- Stage模型
- ArkTS语言
所需权限:
- 只读取应用文件夹内的音频文件,不涉及额外目录,不需要申请读写权限
注册播放器回调函数代码片段:
代码语言:javascript复制 setAVPlayerCallback() {
this.avPlayer.on('error', (err) => {
console.error(`播放器发生错误,错误码:${err.code}, 错误信息:${err.message}`);
// 调用reset重置资源,触发idle状态
this.avPlayer.reset();
})
// 状态机变化回调函数
this.avPlayer.on('stateChange', async (state, reason) => {
switch (state) {
case 'initialized':
console.info('资源初始化完成');
// 资源初始化完成,开始准备文件
this.avPlayer.prepare();
break;
case 'prepared':
console.info('资源准备完成');
// 资源准备完成,开始准备文件
this.avPlayer.play();
break;
case 'completed':
console.info('播放完成');
this.avPlayer.stop();
break;
}
})
}
播放音频函数片段:
代码语言:javascript复制 async onPageShow(){
// 创建avPlayer实例对象
this.avPlayer = await media.createAVPlayer();
// 创建状态机变化回调函数
this.setAVPlayerCallback();
console.info('播放器准备完成')
}
async avPlayerUrl() {
let fdPath = 'fd://';
// 获取音频路径
let context = getContext(this) as common.UIAbilityContext;
let pathDir = context.filesDir;
let path = pathDir '/test.wav';
let res = fs.accessSync(path);
if (!res) {
console.error(`音频文件不存在:${path}`);
promptAction.showToast({ message: "音频文件不存在"})
return
}
// 打开相应的资源文件地址获取fd
let file = await fs.open(path);
fdPath = fdPath '' file.fd;
// url赋值触发initialized状态机上报
this.avPlayer.url = fdPath;
}
完整代码:
代码语言:javascript复制import media from '@ohos.multimedia.media';
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';
@Entry
@Component
struct PlayAudio {
private avPlayer;
async onPageShow(){
// 创建avPlayer实例对象
this.avPlayer = await media.createAVPlayer();
// 创建状态机变化回调函数
this.setAVPlayerCallback();
console.info('播放器准备完成')
}
build() {
Row() {
Column() {
Button('播放音频')
.fontSize(16)
.backgroundColor(Color.Blue)
.onClick(()=>{
this.avPlayerUrl()
})
}
.width('100%')
}
.height('100%')
}
async avPlayerUrl() {
let fdPath = 'fd://';
// 获取音频路径
let context = getContext(this) as common.UIAbilityContext;
let pathDir = context.filesDir;
let path = pathDir '/test.wav';
let res = fs.accessSync(path);
if (!res) {
console.error(`音频文件不存在:${path}`);
promptAction.showToast({ message: "音频文件不存在"})
return
}
// 打开相应的资源文件地址获取fd
let file = await fs.open(path);
fdPath = fdPath '' file.fd;
// url赋值触发initialized状态机上报
this.avPlayer.url = fdPath;
}
// 注册avplayer回调函数
setAVPlayerCallback() {
this.avPlayer.on('error', (err) => {
console.error(`播放器发生错误,错误码:${err.code}, 错误信息:${err.message}`);
// 调用reset重置资源,触发idle状态
this.avPlayer.reset();
})
// 状态机变化回调函数
this.avPlayer.on('stateChange', async (state, reason) => {
switch (state) {
case 'initialized':
console.info('资源初始化完成');
// 资源初始化完成,开始准备文件
this.avPlayer.prepare();
break;
case 'prepared':
console.info('资源准备完成');
// 资源准备完成,开始准备文件
this.avPlayer.play();
break;
case 'completed':
console.info('播放完成');
this.avPlayer.stop();
break;
}
})
}
}