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

【高心星出品】

文章目录

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

音频播放组件的封装

鸿蒙中提供了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.AVPlayerprivate source: media.AVFileDescriptor | stringprivate state: media.AVPlayerState = 'idle'constructor(player: media.AVPlayer, source: media.AVFileDescriptor | string) {// 创建出来playerthis.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 = stateswitch (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.mzph.cn/pingmian/58706.shtml

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

相关文章

KPRCB结构之ReadySummary和DispatcherReadyListHead

ReadySummary: Uint4B DispatcherReadyListHead : [32] _LIST_ENTRY 请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)

【染色时间】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N 510; int dx[] {0,0,-1,1}, dy[] {-1,1,0,0}; int d[N][N], w[N][N]; int n, m; void bfs() {memset(d, 0x3f, sizeof d);q…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

利用钉钉与金蝶云星空进行付款单自动化集成

钉钉数据集成到金蝶云星空&#xff1a;付款申请单下推生成付款单的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确处理是业务顺利进行的关键。本文将分享一个具体的系统对接集成案例&#xff1a;如何将钉钉平台上的付款申请单&#xff0c;通过轻易云数据集成平台…

前端八股文第七篇

61. React 中有对状态管理做进一步封装吗 在 React 中&#xff0c;除了可以使用原生的状态管理方式&#xff08;即使用组件的 state 属性&#xff09;外&#xff0c;还有一些第三方库对状态管理进行了进一步封装&#xff0c;以提供更强大和便捷的状态管理功能。其中最常见的是…

青少年编程能力等级测评CPA Python编程(一级)

青少年编程能力等级测评CPA Python编程(一级) &#xff08;考试时间90分钟&#xff0c;满分100分&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; 下列语句的输出结果是&#xff08; &#xff09;。 print(35*2) A&a…

JavaScript语法基础(函数,对象,常用类Array,String,Math和Date)【超详细!!!新手入!!!】

一、函数 1、函数的定义 函数指的是一段可被重复调用的代码块。函数与变量不同&#xff0c;需要先定义再调用。 定义函数的语法格式为&#xff1a; function 函数名&#xff08;参数1&#xff0c;参数2&#xff0c;...&#xff09; { 语句&#xff1b; …

每日OJ题_牛客_NC6二叉树中的最大路径和_树形DP_C++_Java

目录 牛客_NC6二叉树中的最大路径和_树形DP 题目解析 C代码 Java代码 牛客_NC6二叉树中的最大路径和_树形DP 二叉树中的最大路径和_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 二叉树里面的路径被定义为:从该树的任意节点出发&#xff0c;经过父>子或者子>…

PG数据库 jsonb字段 模糊查询

背景&#xff1a; 项目由于多语言的设计&#xff0c;将字段设置成json字段类型&#xff0c;同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构&#xff1a;name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…

黑龙江某涝区泵闸站自动化、信息化改造项目案例

项目背景 黑龙江某地区紧邻松花江&#xff0c;雨季时降雨量增大&#xff0c;排水渠水位上涨&#xff0c;如果出现排涝不及时&#xff0c;水位过高时会漫入周边农田&#xff0c;引发洪涝灾害&#xff0c;对作物生长造成重大损害。为应对这一问题&#xff0c;自今年起&#xff0c…

奥数与C++小学四年级(第十八题 小球重量)

参考程序代码&#xff1a; #include <iostream> #include <vector>int main() {// 小球的重量std::vector<int> weights {1, 2, 3, 4, 5};// 用来存储可能的结果int a, b, c, d, e, x;// 穷举所有可能的 a, b, c, d, e 的组合for (int i 0; i < weight…

建筑行业知识库搭建:好处、方法与注意事项

在建筑行业&#xff0c;知识管理对于提升项目效率、降低成本、增强创新能力以及构建竞争优势具有至关重要的作用。搭建一个高效、系统的建筑行业知识库&#xff0c;不仅有助于实现知识的有效沉淀与便捷共享&#xff0c;还能促进知识在项目实践中的灵活应用&#xff0c;从而加速…

控制器一些不常用的的功能说明

1、IIC的特殊功能 1.1、IIC的10bit设备地址 10bit地址格式与7bit地址不同&#xff0c;分发送方向和接收方向。 1.1.1、发送方向 第一个字节的前7位是1111 0XX&#xff1a;XX是10bit地址的最高有效位的前两位 第一个字节的第8bit是读写位&#xff1a;决定传输方向 第二个字节…

ssm+vue657基于spring和vue开发的web新闻流媒体平台

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

Spring Boot 3项目创建与示例(Web+JPA)

以下是一个Spring Boot 3.3.4整合JPA的示例,它展示了如何在Spring Boot应用程序中使用JPA进行数据持久化。 版本与环境 Spring Boot 3.3.4数据库: MySQL 8.0.40, MySQL的安装使用可以参考: MySQL 8 下载与安装攻略JDK 17Maven 3.6项目创建 可以使用Spring Initializr 初始…

龙迅#LT8668EX显示器图像处理芯片 适用于HDMI1.4+VGA转4PORT LVDS,支持4K30HZ分辨率,可做OSD菜单亮度调节!

1. 一般说明 LT8668EX 是 Lontium 的第二代 LCD 控制器&#xff0c;基于 ClearEdge 技术&#xff0c;支持 VGA 接口和 HDMI 接口&#xff0c;符合 HDMI 1.4 规范。它可以支持带 HDMI 接口的双模 DP。为了向后兼容&#xff0c;该 LCD 控制器还包括一个高性能模拟接口&#xff0…

[pdf,epub]105页《分析模式》漫谈合集01

105页的《分析模式》漫谈合集第1集的pdf、epub文件&#xff0c;已上传到本账号的CSDN资源。 如果无法下载&#xff0c;也可以访问umlchina.com/url/ap.html 已排版成适合手机阅读&#xff0c;pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》&#xff1f; ★[缝合故…

【升华】springboot中的加解密工具Java Simplified Encryption

一、前言 一般公司的核心业务代码中&#xff0c;都会存在与数据库、第三方通信的secret key等敏感信息&#xff0c;如果以明文的方式存储&#xff0c;一旦泄露&#xff0c;那将会给公司带来巨大的损失。 然而&#xff0c;许多中小型公司开发者对这方面的管理不够规范&#xff…

注释多行代码的vim插件

编写vim 插件代码 add_comments.vim function! AddComment()let l:comment #if &filetype cpplet l:comment //elseif &filetype clet l:comment //endiflet [l:start, l:end][ line("<"), line(">") ]let l:commented_lines []for …

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

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