1 个回答

把快门声音资源文件放到resource/rawfile目录下,使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放(文件放在resource/rawfile目录下)。

参考示例如下:

import media from '@ohos.multimedia.media'
import { AppUtil } from '@pura/harmony-utils'
import { BusinessError } from '@ohos.base'
import resourceManager from '@ohos.resourceManager';

class ShutterSound {
  private count: number = 0
  private isSeek: boolean = true // 用于区分模式是否支持seek操作
  // 注册avplayer回调函数
  private setAVPlayerCallback(avPlayer: media.AVPlayer) {
    // seek操作结果回调函数
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      console.log(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`)
    })
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
    avPlayer.on('error', (err: BusinessError) => {
      console.log(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`)
      avPlayer.reset() // 调用reset重置资源,触发idle状态
    })
    // 状态机变化回调函数
    avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.log('AVPlayer state idle called.')
          avPlayer.release() // 调用release接口销毁实例对象
          break
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.log('AVPlayer state initialized called.')
          avPlayer.prepare()
          break
        case 'prepared': // prepare调用成功后上报该状态机
          console.log('AVPlayer state prepared called.')
          avPlayer.play() // 调用播放接口开始播放
          break
        case 'playing': // play成功调用后触发该状态机上报
          console.log('AVPlayer state playing called.')
          break
        case 'paused': // pause成功调用后触发该状态机上报
          console.log('AVPlayer state paused called.')
          avPlayer.play() // 再次播放接口开始播放
          break
        case 'completed': // 播放结束后触发该状态机上报
          console.log('AVPlayer state completed called.')
          avPlayer.stop() //调用播放结束接口
          break
        case 'stopped': // stop接口成功调用后触发该状态机上报
          console.log('AVPlayer state stopped called.')
          avPlayer.reset() // 调用reset接口初始化avplayer状态
          break
        case 'released':
          console.log('AVPlayer state released called.')
          break
        default:
          console.log(`AVPlayer state ${state} called.`)
          break
      }
    })
  }

  async play() {
    let avPlayer: media.AVPlayer = await media.createAVPlayer()
    this.setAVPlayerCallback(avPlayer)
    let fileDescriptor = await getContext(this).resourceManager.getRawFd('object.mp3')
    let avFileDescriptor: media.AVFileDescriptor =
      { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length }
    avPlayer.fdSrc = avFileDescriptor
  }
}

export default new ShutterSound()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进