使用AVPlayer播放视频
·
概述
我们经常会遇到的应用开发便是视频的播放,那么接下来我们看一下在鸿蒙开发中的视频开发步骤
环境描述
开发环境:Windows 10
DevEco Studio 版本:DevEco Studio 5.0.0 Release(5.0.3.910)
SDK 版本:5.0.0.70(Full SDK)
设备型号:黄鹂
系统版本:OpenHarmony 5.0.0.710
步骤
1、调用createAVPlayer()创建AVPlayer实例,初始化进入idle状态。
2、设置业务需要的监听事件,搭配全流程场景使用
3、设置资源:设置属性url,AVPlayer进入initialized状态。
4、设置窗口:获取并设置属性SurfaceID,用于设置显示画面。 应用需要从XComponent组件获取surfaceID,获取方式请参考XComponent。
5、准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置缩放模式、音量等。
6、视频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。
7、(可选)更换资源:调用reset()重置资源,AVPlayer重新进入idle状态,允许更换资源url。
8、退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。
示例:
import { media } from '@kit.MediaKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { common } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; export class AVPlayerDemo { private count: number = 0; private surfaceID: string = ''; // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法。 private isSeek: boolean = true; // 用于区分模式是否支持seek操作。 private fileSize: number = -1; private fd: number = 0; constructor(surfaceID: string) { this.surfaceID = surfaceID; } // 注册avplayer回调函数。 setAVPlayerCallback(avPlayer: media.AVPlayer) { // startRenderFrame首帧渲染回调函数。 avPlayer.on('startRenderFrame', () => { console.info(`AVPlayer start render frame`); }); // seek操作结果回调函数。 avPlayer.on('seekDone', (seekDoneTime: number) => { console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`); }); // error回调监听函数,当avPlayer在操作过程中出现错误时调用reset接口触发重置流程。 avPlayer.on('error', (err: BusinessError) => { console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`); avPlayer.reset(); // 调用reset重置资源,触发idle状态。 }); // 状态机变化回调函数。 avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => { switch (state) { case 'idle': // 成功调用reset接口后触发该状态机上报。 console.info('AVPlayer state idle called.'); avPlayer.release(); // 调用release接口销毁实例对象。 break; case 'initialized': // avplayer 设置播放源后触发该状态上报。 console.info('AVPlayer state initialized called.'); avPlayer.surfaceId = this.surfaceID; // 设置显示画面,当播放的资源为纯音频时无需设置。 avPlayer.prepare(); break; case 'prepared': // prepare调用成功后上报该状态机。 console.info('AVPlayer state prepared called.'); avPlayer.play(); // 调用播放接口开始播放。 break; case 'playing': // play成功调用后触发该状态机上报。 console.info('AVPlayer state playing called.'); if (this.count !== 0) { if (this.isSeek) { console.info('AVPlayer start to seek.'); avPlayer.seek(avPlayer.duration); //seek到视频末尾。 } else { // 当播放模式不支持seek操作时继续播放到结尾。 console.info('AVPlayer wait to play end.'); } } else { avPlayer.pause(); // 调用暂停接口暂停播放。 } this.count++; break; case 'paused': // pause成功调用后触发该状态机上报。 console.info('AVPlayer state paused called.'); avPlayer.play(); // 再次播放接口开始播放。 break; case 'completed': // 播放结束后触发该状态机上报。 console.info('AVPlayer state completed called.'); avPlayer.stop(); //调用播放结束接口。 break; case 'stopped': // stop接口成功调用后触发该状态机上报。 console.info('AVPlayer state stopped called.'); avPlayer.reset(); // 调用reset接口初始化avplayer状态。 break; case 'released': console.info('AVPlayer state released called.'); break; default: console.info('AVPlayer state unknown called.'); break; } }); }
/ 以下demo为通过url设置网络地址来实现播放直播码流的demo。 async avPlayerLiveDemo() { // 创建avPlayer实例对象。 let avPlayer: media.AVPlayer = await media.createAVPlayer(); // 创建状态机变化回调函数。 this.setAVPlayerCallback(avPlayer); this.isSeek = false; // 不支持seek操作。 avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8'; // 播放hls网络直播码流。 }
更多推荐
所有评论(0)