鸿蒙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() }