当前位置: 首页 > news >正文

开发中使用——鸿蒙播放本地mp3文件

文章目录

  • 背景
  • 现实
  • 解决
    • 一、创建AVPlayer实例对象
    • 二、设置mp3的播放路径
    • 三、设置AVPlayer回调,监听播放事件
    • 四、其他操作
  • 感谢
  • 吐槽


背景

项目中有个功能需要播放本地的mp3音频,想着只是一个简单的功能,看一下官方文档,很容易就实现了,因为苹果和安卓都很容易实现。

现实

现实是打脸的,按照官方文档——使用AVPlayer播放音频(ArkTS)文档写一遍,你会发现无论是加载网上的.mp3文件,还是本地rawfile文件下的.mp3都报错。

解决

一、创建AVPlayer实例对象

  /*** 创建Player实例*/async createAVPlayerInstance() {this.avPlayer = await media.createAVPlayer();}

二、设置mp3的播放路径

  /*** 设置mp3的播放路径* @param context* @param path*/async setSourcePath(context:common.UIAbilityContext,path: string) {setTimeout(async () => {if (this.avPlayer) {try {let fileDescriptor = await context.resourceManager.getRawFd(path);let fileFd: number = JSON.parse(JSON.stringify(fileDescriptor))['fd']let fileOffset: number = JSON.parse(JSON.stringify(fileDescriptor))['offset']let avFileDescriptor: media.AVFileDescriptor = { fd: fileFd, offset: fileOffset, length: -1 };this.avPlayer!.fdSrc = avFileDescriptor;} catch (err) {console.info('Set Url failed : ' + JSON.stringify(err))}}}, 500)}

三、设置AVPlayer回调,监听播放事件

  /*** 设置avplayer回调,监听播放事件*/private setAVPlayerCallback() {if (!this.avPlayer) {return}// seek操作结果回调this.avPlayer!.on('seekDone', (seekDoneTime) => {console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);})// 音量变化回调this.avPlayer!.on('volumeChange', (volume) => {console.info(`volumeChange called, and new volume is :${volume}`);})// 音频总时长this.avPlayer!.on('durationUpdate', (duration) => {console.info(`durationUpdate :${duration}`);this.duration = duration;})// 当前播放进度this.avPlayer!.on('timeUpdate', (time) => {let now = Math.floor(time/1000)if (this.process != now) {console.info(`timeUpdate :${now}`);}this.process = now})// error回调监听函数,当avPlayer在操作过程中出现错误时调用reset接口触发重置流程this.avPlayer!.on('error', (err) => {console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);this.avPlayer!.reset(); // 调用reset重置资源,触发idle状态})// 状态机变化回调函数this.avPlayer!.on('stateChange', async (state, reason) => {switch (state) {case 'idle': // 成功调用reset接口后触发该状态机上报console.info('AVPlayer state idle called.');this.avPlayer!.release(); // 调用release接口销毁实例对象break;case 'initialized': // avplayer 设置播放源后触发该状态上报console.info('AVPlayer state initialized called.');this.avPlayer!.prepare().then(() => {console.info('AVPlayer prepare succeeded.');}, () => {console.error(`Invoke prepare failed, code is`);});break;case 'prepared': // prepare调用成功后上报该状态机console.info('AVPlayer state prepared called.');this.avPlayer!.loop = this.loopif (this.autoPlay) {this.avPlayer!.play(); // 调用播放接口开始播放}break;case 'playing': // play成功调用后触发该状态机上报console.info('AVPlayer state playing called.');break;case 'paused': // pause成功调用后触发该状态机上报console.info('AVPlayer state paused called.');break;case 'completed': // 播放结束后触发该状态机上报console.info('AVPlayer state completed called.');if (this.loop == true) {this.avPlayer!.seek(0)this.avPlayer!.play()}break;case 'stopped': // stop接口成功调用后触发该状态机上报console.info('AVPlayer state stopped called.');break;case 'released':console.info('AVPlayer state released called.');break;default:console.info('AVPlayer state unknown called.');break;}})}

四、其他操作

  • 播放
  /*** 播放*/play() {if (!this.avPlayer) {this.autoPlay = truereturn}this.avPlayer!.play().then(() => {console.info('Play success')}).catch((err: BusinessError) => {console.info('Play failed : ' + JSON.stringify(err))})}
  • 暂停
  /*** 暂停*/pause() {if (!this.avPlayer) {this.autoPlay = falsereturn}this.avPlayer!.pause().then(() => {console.info('Pause success')}).catch((err: BusinessError) => {console.info('Pause failed : ' + JSON.stringify(err))})}
  • 释放资源
/*** 释放资源*/release() {if (!this.avPlayer) {this.autoPlay = falsereturn}this.avPlayer!.release().then(() => {console.info('release success')}).catch((err: BusinessError) => {console.info('release failed : ' + JSON.stringify(err))})}

感谢

【Harmony Next】使用 AVPlayer 播放音频

吐槽

官方有时间,还是自己跑一遍文档中的代码,以及链接提供的Demo吧!请不要浪费我们开发者的时间,谢谢。
官方文档——使用AVPlayer播放音频(ArkTS)


文章转载自:

http://5NlqLxmR.zdkzj.cn
http://nJaoX3To.zdkzj.cn
http://SoB8C5gb.zdkzj.cn
http://71jncYRC.zdkzj.cn
http://Lo79ErRr.zdkzj.cn
http://UPcuj2p3.zdkzj.cn
http://FGPkCDlP.zdkzj.cn
http://i1dou4FT.zdkzj.cn
http://aSgAoyWQ.zdkzj.cn
http://EEhxO3zK.zdkzj.cn
http://yFCOI4Vt.zdkzj.cn
http://r5AioPqh.zdkzj.cn
http://ju3vJHiK.zdkzj.cn
http://exRfgFuj.zdkzj.cn
http://Y38Aepoj.zdkzj.cn
http://6WNaGUle.zdkzj.cn
http://RMm9RZIy.zdkzj.cn
http://0i0iZGAE.zdkzj.cn
http://ksktDp4h.zdkzj.cn
http://rmyx6rqL.zdkzj.cn
http://diFhS3qK.zdkzj.cn
http://R1crMao2.zdkzj.cn
http://4J4nzqzx.zdkzj.cn
http://pSfhfx5D.zdkzj.cn
http://KDFpqPik.zdkzj.cn
http://C6yqlkuH.zdkzj.cn
http://clcTlq4a.zdkzj.cn
http://rK0aWe5j.zdkzj.cn
http://NBFpjLtV.zdkzj.cn
http://F15AGAX8.zdkzj.cn
http://www.dtcms.com/a/373646.html

相关文章:

  • DLL修复是什么意思?为什么总会缺失?(详细教程)
  • 高强度应用下天硕工业级SSD固态硬盘真的更耐用吗?
  • c++基础学习(学习蓝桥杯 ros2有C基础可看)
  • SpringBoot学习日记 Day10:企业级博客系统开发实战(一)
  • 嵌入式学习---(硬件)
  • 写算法第二题(英语介词)dom对象
  • cn2an:中文数字与阿拉伯数字的智能转换工具
  • Hive和Flink数据倾斜问题
  • 嵌入式ARM架构学习2——汇编
  • 渗透测试全景解析:从基础概念到实战演练
  • 鸿蒙Next应用UI稳定性故障调试:从崩溃到流畅的实战指南
  • 企智汇施工工程项目管理系统:全生命周期信息化管理解决方案!施工企业管理系统!施工企业项目管理软件!工程项目管理系统!工程项目管理软件!
  • 遥感数据同化方法:集合卡尔曼滤波和变分同化算法
  • mac安装Java开发环境
  • Java网络初识(2):IP地址和端口号,协议,五元组
  • 什么是算法:高效解决问题的逻辑框架
  • EFCore与EF6:ORM技术深度解析
  • 【开题答辩全过程】以 线上“三味书屋”学习平台设计与实现为例,包含答辩的问题和答案
  • iframe引入界面有el-date-picker日期框,点击出现闪退问题处理
  • BP-Adaboost模型
  • 使用redis的发布/订阅(Pub/Sub), 实现消息队列
  • 鸿蒙:更改状态栏、导航栏颜色
  • [数据结构——lesson4.双向链表]
  • 集成学习:从理论到实践的全面解析
  • 机器学习-集成学习
  • 集成学习简介
  • JDK 17、OpenJDK 17、Oracle JDK 17 的说明
  • VM中CentOS 7密码重置
  • 科技信息差(9.8)
  • MATLAB的数值计算(三)曲线拟合与插值