鸿蒙AVPlayer播放音效实践
在鸿蒙应用开发过程中,用户常常希望在执行一些操作后播放一些提示音效。比如发送一条消息之后播放一个简短的提示音。鸿蒙SDK的@kit.MediaKit组件包下提供了一个media.AVPlayer可用于这样的需求。首先准备一个xxx.wav的音效文件,将其放\entry\src\main\resources\rawfile\目录下面,然后声明一个AVPlayer实例,示例代码如下:
avPlayer: media.AVPlayer = await media.createAVPlayer()
紧接着就是要给AVPlayer实例注册stateChange状态回调函数了,这一步必须得做,如果直接调用AVPlayer实例的play方法来播放音效是不行的,必须在状态为initialized的时候调用实例的prepare方法,然后在状态为prepare的时候调用实例的play方法,示例代码如下:
this.avPlayer.on('stateChange', (state: string) => {
console.debug('AVPlayer: ', state)
switch (state) {
case 'initialized':
this.avPlayer?.prepare()
break;
case 'prepared':
this.avPlayer?.play()
break;
case 'playing':
break;
case 'paused':
break;
case 'completed':
this.reset();
this.stop()
this.release()
break;
case 'stopped':
this.reset()
this.release()
break;
case 'released':
break;
case 'error':
this.reset()
this.stop()
this.release()
break;
default:
this.reset()
this.stop()
this.release()
break;
}
})第三步就是封装一个play方法,通过上下文对象的resourceManager.getRawFdSync方法获取第一步目录下的音效文件,然后根据音效文件声明一个media.AVFileDescriptor实例,最后把media.AVFileDescriptor实例赋值给AVPlayer实例的fdSrc的属性即可。示例代码如下:
public async play(audioFileName: string) {
await this.init()
const rawFileDescriptor = AppContextInstance.context.resourceManager.getRawFdSync(audioFileName)
const avFileDescriptor: media.AVFileDescriptor = {
fd: rawFileDescriptor.fd,
offset: rawFileDescriptor.offset,
length: rawFileDescriptor.length
}
this.avPlayer!.fdSrc = avFileDescriptor
// 不要在此处调用media.AVPlayer实例的play方法
// this.avPlayer?.play()
}