前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >鸿蒙应用开发-播放本地音频文件

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

作者头像
夜雨飘零
发布2024-05-26 16:09:44
820
发布2024-05-26 16:09:44
举报
文章被收录于专栏:CSDN博客CSDN博客

功能介绍:

播音音频,提高音频文件路径,播放音频。参考文档使用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;
      }
    })
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档