鸿蒙应用开发-播放本地音频文件

2024-05-26 16:09:44 浏览数 (2)

功能介绍:

播音音频,提高音频文件路径,播放音频。参考文档使用AVPlayer开发音频播放功能。

知识点:

  1. 熟悉使用AVPlayer音视频播放器。
  2. 读取应用文件夹的本地音频文件。
  3. 加载并播放音频。

使用环境:

  • API 9
  • DevEco Studio 4.0 Release
  • Windows 11
  • Stage模型
  • ArkTS语言

所需权限:

  1. 只读取应用文件夹内的音频文件,不涉及额外目录,不需要申请读写权限

注册播放器回调函数代码片段:

代码语言: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;
      }
    })
  }
}

0 人点赞