HarmonyOS 5.0应用开发——音频播放组件的封装

news2024/11/7 3:41:02

【高心星出品】

文章目录

      • 音频播放组件的封装
        • 开发步骤
        • 封装类代码
        • 测试代码

音频播放组件的封装

鸿蒙中提供了AVPlayer来实现音频播放的功能,播放的全流程包含:创建AVPlayer,设置播放资源,设置播放参数(音量/倍速/焦点模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。在进行应用开发的过程中,开发者可以通过AVPlayer的state属性主动获取当前状态或使用on(‘stateChange’)方法监听状态变化。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。

AVPlayer的状态机变化图:

在这里插入图片描述

开发步骤
  1. 创建实例createAVPlayer(),AVPlayer初始化idle状态。
  2. 设置业务需要的监听事件,搭配全流程场景使用。
  3. 设置资源:设置属性url,AVPlayer进入initialized状态。
  4. 准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置音量。
  5. 音频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。
  6. (可选)更换资源:调用reset()重置资源,AVPlayer重新进入idle状态,允许更换资源url。
  7. 退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。

但是AVPlayer用起来太麻烦,下面我做一个简单的封装。

封装类代码
/**
 *作者:gxx
 *时间:2024/11/1 14:32
 *功能:
 **/
import { media } from "@kit.MediaKit";
import { BusinessError } from "@kit.BasicServicesKit";
import { promptAction } from "@kit.ArkUI";

export class MediaPlayer {
  private player: media.AVPlayer
  private source: media.AVFileDescriptor | string
  private state: media.AVPlayerState = 'idle'

  constructor(player: media.AVPlayer, source: media.AVFileDescriptor | string) {
    // 创建出来player
    this.player = player;
    // 设置监听
    this.setListener()
    this.source = source;
    // 设置播放资源
    if (typeof source == 'string') {
      this.player.url = source
    } else {
      this.player.fdSrc = source
    }
  }

  // 设置监听
  private setListener() {
    // 播放错误
    this.player.on('error', (err: BusinessError) => {
      console.error('gxxt play err: ', err.message)
    })
    // 播放完毕
    this.player.on("endOfStream", () => {
      console.log('gxxt play 完毕')
    })
    this.player.on("stateChange", (state, reason) => {
      // 更新当前状态
      this.state = state
      switch (state) {
        case 'idle':
          console.log('gxxt play 刚创建')
          break;
        case 'initialized':
          console.log('gxxt play 初始化好了播放资源')
          this.player.prepare()
          break;
        case 'prepared':
          console.log('gxxt  play 准备好的状态')
          break;
        case 'playing':
          console.log('gxxt play 播放中状态')
          break;
        case 'paused':
          console.log('gxxt play 暂停的状态')
          break;
        case 'stopped':
          console.log('gxxt play 停止的状态')
          break;
        case 'released':
          console.log('gxxt play 释放资源')
          break;
      }
    })
  }

  play() {
    // 如果当前状态是准备态或者暂停可以直接播放  否则先准备
    if (this.state == 'prepared' || this.state == 'paused') {
      this.player.play()
    } else if (this.state == 'stopped') {
      this.player.prepare(() => {
        // 停止状态进来的 要先准备 再开始播放
        this.player.play()
      })
    }
  }

  pause() {
    // 只有是播放状态才能暂停
    if (this.state == 'playing') {
      this.player.pause()
    } else {
      promptAction.showToast({ message: '当前状态不支持暂停' })
    }
  }
  // 停止播放
  stop() {
    this.player.stop()
  }
  //释放资源
  release() {
    this.player.release()
  }

  seekto(time: number) {
    // 滑动播放时间
    if (time < this.player.duration) {
      this.player.seek(time)
    }
  }
}
测试代码

创建AVPplayer对象并准备播放资源。

async aboutToAppear(): Promise<void> {
  //   创建播放器
  let avplayer = await media.createAVPlayer()
  // 获取test.mp3的文件描述符
  let filedes = getContext(this).resourceManager.getRawFdSync('test.mp3')
  // 创建播放资源
  let source: media.AVFileDescriptor = { offset: filedes.offset, fd: filedes.fd, length: filedes.length }
  this.player = new MediaPlayer(avplayer, source)
}
aboutToDisappear(): void {
  this.player?.release()
  }

通过按钮来控制音频的播放和暂停。

Button('播放')
  .width('60%')
  .margin(20)
  .onClick(() => {
    this.player?.play()
  })
Button('暂停')
  .width('60%')
  .margin(20)
  .onClick(() => {
   this.player?.pause()
  })
Button('停止')
  .width('60%')
  .margin(20)
  .onClick(() => {
  this.player?.stop()
  })

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度探索C++对象模型

文章目录 前言一、关于对象C对象模型 二、构造函数实例分析 拷贝构造函数程序转化语意学(Program Transformation Semantics)成员初始化列表 三、数据语义学(The Semantics of Data)数据存取多种继承情况讨论仅单一继承加上虚函数多重继承虚拟继承 Pointer to Data Members 四、…

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…

【Rust中的序列化:Serde(一)】

Rust中的序列化&#xff1a;Serde Serde是什么&#xff1f;什么是序列化序列化&#xff1f;Serde运行机制Serde Data ModelVistor ApiSerializer ApiDeserializer Api 具体示例流程分析具体步骤&#xff1a;那么依次这个结论是如何得出的呢?什么是de? 总结 Serde是什么&#…

普通的Java程序员,需要深究源码吗?

作为Java开发者&#xff0c;面试肯定被问过多线程。对于它&#xff0c;大多数好兄弟面试前都是看看八股文背背面试题以为就OK了&#xff1b;殊不知现在的面试官都是针对一个点往深了问&#xff0c;你要是不懂其中原理&#xff0c;面试就挂了。可能你知道什么是进程什么是线程&a…

【vue项目中添加告警音频提示音】

一、前提&#xff1a; 由于浏览器限制不能自动触发音频文件播放&#xff0c;所以实现此类功能时&#xff0c;需要添加触发事件&#xff0c;举例如下&#xff1a; 1、页面添加打开告警声音开关按钮 2、首次进入页面时添加交互弹窗提示&#xff1a;是否允许播放音频 以上两种方…

2024 windos运行程序的时候弹窗:找不到ddl文件【已经解决,只要三步】修复ddl文件

一、错误复现 就是这个错误&#xff0c;网上一顿乱找&#xff0c;也解决不来&#xff0c;不是花钱就是付费就是充会员&#xff01;&#xff01; 二、ddl官网地址下载新的ddl文件&#xff08;自己缺哪个&#xff0c;搜索哪个下载&#xff09; 然灵机一动&#xff0c;ddl肯定有官…

Java并发常见面试题总结(上)

线程 ⭐️什么是线程和进程? 何为进程? 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程 在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一…

分类算法——逻辑回归 详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛使用的分类算法&#xff0c;特别适用于二分类问题。尽管名字中有“回归”二字&#xff0c;逻辑回归实际上是一种分类方法。下面将从底层原理、数学模型、优化方法以及源代码层面详细解析逻辑回归。 1. 基本原理 …

AutoGLM:智谱AI的创新,让手机成为你的生活全能助手

目录 引言一、AutoGLM&#xff1a;开启AI的Phone Use时代二、技术核心&#xff1a;AI从“语言理解”到“执行操作”三、实际应用案例&#xff1a;AutoGLM的智能力量1. 智能生活管理&#x1f34e;2. 社交网络的智能互动&#x1f351;3. 办公自动化&#x1f352;4. 电子商务的购物…

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛&#xff1a;台风预测与分析 引言 在2024年MathorCup大数据挑战赛中&#xff0c;赛道A聚焦于气象数据分析&#xff0c;特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…

Latex中Reference的卷号加粗的问题

找到模板中的.bst文件&#xff0c;查找volume&#xff0c;修改如下 添加bold&#xff0c;卷号会加粗&#xff0c;去掉则正常

国产光耦合器在现代应用中的作用和进步

国产光耦合器已成为各行各业必不可少的元件&#xff0c;有助于确保信号完整性、保护控制系统并提供强大的电气隔离。随着技术的进步&#xff0c;国内制造商提高了光耦合器的质量和可靠性&#xff0c;使其适用于一系列关键应用。本文探讨了国产光耦合器的优势、其应用及其对关键…

《数值分析》实验报告-线性方程组求解

文章目录 1. 实验目标2. 实验内容2.1 设计界面2.2 实现解法2.2.1 高斯消元法2.2.2 克劳斯消元法2.2.3 列主元素法 2.3 结果展示 3. 实现过程3.1 选择并设计算法3.1.1 高斯消元法3.1.2 克劳斯消元法3.1.3 列主元素法 3.2 设计 Tkinter 界面3.3 编写代码实现3.4 结果显示 4. 输入…

SpringBoot接入星火认知大模型

文章目录 准备工作整体思路接入大模型服务端和大模型连接客户端和服务端的连接测试 准备工作 到讯飞星火大模型上根据官方的提示申请tokens 申请成功后可以获得对应的secret&#xff0c;key还有之前创建的应用的appId&#xff0c;这些就是我们要用到的信息 搭建项目 整体思…

使用OpenAI控制大模型的输出(免费)——response_format

免费第三方api-key(硅基流动)使用OpenAI格式&#xff0c;还能控制大模型的输出格式&#xff0c;不能说真香&#xff0c;只能说 真香Plus&#xff01; API-Key领取方法看这篇教程 【1024送福利】硅基流动送2000万token啦&#xff01;撒花✿✿ 附使用教程 支持十几个免费的大模…

Databend 产品月报(2024年10月)

很高兴为您带来 Databend 2024 年 10 月的最新更新、新功能和改进&#xff01;我们希望这些增强功能对您有所帮助&#xff0c;并期待您的反馈。 Databend Cloud&#xff1a;多集群的计算集群 多集群的计算集群会根据工作负载需求自动调整计算资源&#xff0c;添加或移除集群。…

多线程编程与并发控制缓存策略负载均衡数据库优化

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

硅谷甄选(8)spu

Spu模块 SPU(Standard Product Unit)&#xff1a;标准化产品单元。是商品信息聚合的最小单位&#xff0c;是一组可复用、易检索的标准化信息的集合&#xff0c;该集合描述了一个产品的特性。通俗点讲&#xff0c;属性值、特性相同的商品就可以称为一个SPU。 7.1 Spu模块的静态…

【Three.js】SpriteMaterial 加载图片泛白,和原图片不一致

解决方法 如上图所示&#xff0c;整体泛白了&#xff0c;解决方法如下&#xff0c;添加 material.map.colorSpace srgb const imgTexture new THREE.TextureLoader().load(imgSrc)const material new THREE.SpriteMaterial({ map: imgTexture, transparent: true, opacity:…

【高阶数据结构】红黑树的插入

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…