各位IT大咖你们好,我是神秘面具男,接下来与大家讨论HarmonyOS中AVPlayer的简单用法。
1、简介
AVPlayer是HarmonyOS提供的一个音视频播放接口,整合了本地资源、视频解码、媒体封闭与渲染等一系列功能,可直接播放mp4、mkv等格式的视频文件,适合开发者对媒体资源进行自定义和控制播放逻辑。
播放示意图如下
2、开发流程
- 调用
createAvplay()能力创建AVPlay实例,初始化进入idel状态。 - 设置需要的监听事件。
| 事件类型 | 说明 |
|---|---|
| stateChange | 必要事件,监听播放器的state属性改变。 |
| error | 必要事件,监听播放器的错误信息。 |
| durationUpdate | 用于进度条,监听进度条长度,刷新资源时长。 |
| timeUpdate | 用于进度条,监听进度条当前位置,刷新当前时间。 |
| seekDone | 响应API调用,监听seek()请求完成情况。当使用seek()跳转到指定播放位置后,如果seek操作成功,将上报该事件。 |
| speedDone | 响应API调用,监听setSpeed()请求完成情况。当使用setSpeed()设置播放倍速后,如果setSpeed操作成功,将上报该事件。 |
| volumeChange | 响应API调用,监听setVolume()请求完成情况。当使用setVolume()调节播放音量后,如果setVolume操作成功,将上报该事件。 |
| bitrateDone | 响应API调用,用于HLS协议流,监听setBitrate()请求完成情况。当使用setBitrate()指定播放比特率后,如果setBitrate操作成功,将上报该事件。 |
| availableBitrates | 用于HLS协议流,监听HLS资源的可选bitrates,用于setBitrate()。 |
| bufferingUpdate | 用于网络播放,监听网络播放缓冲信息。 |
| startRenderFrame | 用于视频播放,监听视频播放首帧渲染时间。当AVPlayer首次起播进入playing状态后,等到首帧视频画面被渲染到显示画面时,将上报该事件。应用通常可以利用此事件上报,进行视频封面移除,达成封面与视频画面的顺利衔接。 |
| videoSizeChange | 用于视频播放,监听视频播放的宽高信息,可用于调整窗口大小、比例。 |
| audioInterrupt | 监听音频焦点切换信息,搭配属性audioInterruptMode使用。如果当前设备存在多个媒体正在播放,音频焦点被切换(即播放其他媒体如通话等)时将上报该事件,应用可以及时处理。 |
- 资源设置:属性
url,AVPlay会进入到initialized状态。 - 设置窗口:获取并设置
SurfaceID属性,用来设置显示的画面,应用需要从XComponent组件中获取SurfaceID。 - 准备播放:调用
prepare(),AVPlay进入prepared(准备)状态,这时即可获取duration,并设置缩放、音量等。 - 控制视频:播放play()、暂停pause()、跳转seek()、停止stop()等。
- 更换资源:只要调用
reset()重置资源方法,让AVPlay重新进入idle状态,就可以进行资源url更换。 - 退出播放:使用
release()对实例进行销毁,AVPlay进入released状态,为退出播放。
3、代码介绍
1、引入相关能力kit集
import {media} from '@...'
2、注册回调并创建实例
// 注册avplayer回调函数。
setAVPlayerCallback(avPlayer: media.Avplayer){
...
}
// 创建AVPlayer实例
async avPlayerDemo(){
let avPlay: media.AVPlayer = await media.createAVPlayer();
3、设置监听
this.avPlayer.on("stateChange", (state) => {
// 处理状态的变化
})
this.avPlayer.on("error", (e) => {
// 错误处理
})
4、播放资源
// 使用网络资源,需要在model.json5申请权限:ohos.permission.INTERNET
this.avPlayer.url = "http....mp4";
// 本地资源
let fdPath = 'fd://';
let file = await fs.open(pathToVifeoFile);
fdPath += file.fd;
this.avPlayer.url = fdPath;
5、显示窗口
// 你已经从XComponent获取到了surfaceID
this.avPlayer.surfaceID = this.surfaceID;
6、开始播放
this.avPlayer.prepare();
7、控制播放
this.avPlayer.play(); // 播放
this.avPlayer.pause(); // 暂停
this.avPlayer.seek(10); // 跳转至10秒进行播放
this.avPlayer.stop(); // 停止
8、更换资源/退出释放资源
this.avPlayer.reset(); // 进行重置,方便更换资源
this.avPlayer.release(); 退出播放并释放资源
4、成品
这只简单的avplayer开发流程,更多精彩内容尽在官方文档,经过半天的编码努力,得到如下成果。
别问我为什么不放视频因为我不会O_O.