HarmonyOS7 音视频播放:AVPlayer 实战

发布时间:2026/10/21 11:10:40

HarmonyOS7 音视频播放:AVPlayer 实战 文章目录前言AVPlayer 是什么代码实现画面载体XComponent核心代码播放控制完整示例完整播放器骨架常见误区小白必踩完整可运行示例AVPlayer 播音频代码解析写在最后前言做个能播放音视频的 app听起来高大上其实 HarmonyOS 已经把最难的编解码封装好了你只要学会AVPlayer这个播放器对象怎么用就行。这篇文章我带你实现一个播放/暂停/进度俱全的本地视频播放器。网络视频套路一样只是地址不同。AVPlayer 是什么AVPlayer是系统提供的多媒体播放器负责拿到资源 → 解码 → 输出到界面。你不用懂编解码只要设置数据源、准备、播放、控制。代码实现import{media}fromkit.MediaKitletplayer:media.AVPlayerasyncfunctioninitPlayer(surfaceId:string,url:string){playerawaitmedia.createAVPlayer()player.urlurl// 设置播放地址player.surfaceIdsurfaceId// 绑定到 XComponent 的渲染表面}要点createAVPlayer()异步创建播放器。player.url本地或网络媒体地址。player.surfaceId播放画面要贴在哪个渲染表面上这个表面由XComponent提供见下。画面载体XComponent视频画面不能直接用普通组件显示得用XComponent提供一块原生渲染表面核心代码LocalsurfaceId:stringbuild(){Column(){XComponent({id:video,type:XComponentType.SURFACE,controller:this.xcCtrl}).onLoad((surfaceId:string){this.surfaceIdsurfaceId// 拿到表面 id}).width(100%).height(240)}}XComponent的onLoad回调会给你一个surfaceId把它存起来传给player.surfaceId画面就出来了。必须先有surfaceId才能初始化播放器——所以初始化要等onLoad之后。播放控制播放器有几个核心状态控制就围绕它们完整示例functionplay(){player.play()}// 播放functionpause(){player.pause()}// 暂停functionseekTo(ms:number){player.seek(ms)}// 拖到指定毫秒// 监听状态与进度player.on(stateChange,(state){console.info(播放器状态state)// playing / paused / completed})player.on(timeUpdate,(cur:number,dur:number){this.progresscur/dur// 计算播放进度比例})play()/pause()最基础的播放暂停。seek(ms)跳转到指定时间做进度条拖动用。timeUpdate事件持续回调当前时间和总时长用来更新进度条。完整播放器骨架EntryComponentV2struct VideoPlayer{LocalsurfaceId:stringLocalprogress:number0Localplaying:booleanfalseprivatexcCtrl:XComponentControllernewXComponentController()privateplayer?:media.AVPlayerbuild(){Column(){XComponent({id:v,type:XComponentType.SURFACE,controller:this.xcCtrl}).onLoad(async(id){this.surfaceIdidthis.playerawaitmedia.createAVPlayer()this.player.urlfile:///data/storage/el2/base/haps/entry/files/demo.mp4this.player.surfaceIdidthis.player.on(timeUpdate,(c,d){this.progressd?c/d:0})}).width(100%).height(240)Row(){Button(this.playing?暂停:播放).onClick((){if(this.playing){this.player?.pause();this.playingfalse}else{this.player?.play();this.playingtrue}})Slider({value:this.progress*100,min:0,max:100}).onChange((v){this.player?.seek(v/100*1000)})}}.padding(12)}}这是一个能播、能暂停、能拖进度的播放器雏形。常见误区小白必踩误区说明surfaceId没拿到就初始化播放器必须先等XComponent.onLoad拿到表面 id再创建 AVPlayer 绑定。不监听timeUpdate进度条要的当前/总时长都从这里来不监听就做不了进度条。音频也套 XComponent纯音频不需要画面载体直接createAVPlayer设 url 播放即可。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例AVPlayer 播音频用AVPlayer播放一段网络音频带播放/暂停控制。代码解析// AVPlayer 播放网络音频import{media}fromkit.MediaKitEntryComponentstruct AudioPlayer{privateavp?:media.AVPlayerStateplaying:booleanfalseaboutToAppear(){media.createAVPlayer().then((p){this.avpp p.urlhttps://example.com/song.mp3// 设置数据源p.on(stateChange,(s){if(splaying){this.playingtrue}if(spaused){this.playingfalse}})})}build(){Column({space:16}){Text(this.playing?播放中:已暂停).fontSize(20)Button(this.playing?暂停:播放).onClick((){if(this.playing){this.avp?.pause()}else{this.avp?.play()}})}.padding(20)}}你会看到什么进入页面后点「播放」文字变「播放中」并听到声音点「暂停」停止。状态由stateChange事件驱动 UI。动手改一改把url换成你自己的音频地址验证。监听timeUpdate事件做一个进度条。在aboutToDisappear里this.avp?.release()避免资源泄漏。写在最后AVPlayer 的套路建播放器 → 绑 surfaceId → 设 url → 监听进度 → 控制播放。画面靠XComponent出控制靠play/pause/seek。音频播放更简单——不需要XComponent直接createAVPlayer设 url 播放即可。做音乐 app 的话把视频那套 surface 部分去掉就行。
延伸阅读

更多相关文章

2026/10/21 15:40:37

静态路由与DHCP中继对比:2种方案实现跨VLAN三层互通与地址分配

跨VLAN三层互通与地址分配:静态路由与DHCP中继的深度技术选型指南在网络架构设计中,跨VLAN通信与IP地址分配是每个网络工程师必须掌握的核心技能。当企业网络规模扩大,VLAN数量增多时,如何高效实现全网可达和自动化地址分配成为关…

2026/10/20 8:04:55

专业高效:Typora插件增强工具全面指南与实用教程

专业高效:Typora插件增强工具全面指南与实用教程 【免费下载链接】typora_plugin Typora Plugin. Feature Enhancement Tool | Typora 插件,功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin Typora插件项目是一个功能强…

2026/10/22 5:07:43

YOLOv10n实现HWD上下手势识别:从训练到边缘部署全流程实战

聊一个最近落地的视觉项目:用 YOLOv10n 做 HWD 方向手势识别,核心任务就是 “上下手势检测”。这个项目看起来简单,但真正把它从训练跑到边缘设备、再从设备跑到实际交互,坑其实不少。HWD 我习惯理解成 Hand Gesture Direction&am…

2026/10/22 5:07:43

千笔写作工具实测:一键生成论文到底靠不靠谱?

最近问我"有没有办法快速写出一篇像样的论文"的人实在是太多了,很多人一开口就是"我想用那种一键生成论文的工具,行不行"。我干脆花了一整个晚上,把这类讨论度最高的写作工具翻来覆去试了个遍,其中一个就是标…

2026/10/22 5:07:43

神经接口物理层突破:从AI到SI的工程真相

1. 标题里的“AI”与“SI”根本不是技术术语,而是传播策略的精准切口看到这个标题,我第一反应不是去查“SI”在学术文献里有没有定义,而是立刻翻出过去三年所有马斯克公开信、推文和发布会逐字稿——结果很明确:他本人从未在任何正…

2026/10/22 5:07:43

Java静态调用链分析:基于JavaParser的AST方法追溯技术

简介:这是一套基于JavaParser实现的Java代码方法调用链静态分析工具,面向Java中高级开发者、代码质量工程师及编译器原理学习者,用于快速识别类间方法调用关系、构建调用图谱并辅助重构或依赖分析。资源包共105个文件,含64个核心J…

2026/10/22 5:02:43

AI辅助需求分析实战:从需求采集到文档初稿的高效流程

坦白说,第一次把“AI”和“需求分析”放在同一个工作流里的时候,我心里是打问号的。需求分析这件事,往小了说是“把用户说的话翻译成开发能懂的文档”,往大了说是“在模糊、冲突、信息缺失的环境里找到正确的问题”。AI能读懂业务…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目,目标很直白:把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事,逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间,我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依,按理说这类业务代码模式非常固定,应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块,它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑