HarmonyNote.TOP鸿蒙开发笔记

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