HarmonyOS媒体播放AVPlayer

274 阅读3分钟

各位IT大咖你们好,我是神秘面具男,接下来与大家讨论HarmonyOS中AVPlayer的简单用法。

1、简介

AVPlayerHarmonyOS提供的一个音视频播放接口,整合了本地资源、视频解码、媒体封闭与渲染等一系列功能,可直接播放mp4、mkv等格式的视频文件,适合开发者对媒体资源进行自定义和控制播放逻辑。

播放示意图如下

image.png

2、开发流程
  1. 调用createAvplay()能力创建AVPlay实例,初始化进入idel状态。
  2. 设置需要的监听事件。
事件类型说明
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使用。如果当前设备存在多个媒体正在播放,音频焦点被切换(即播放其他媒体如通话等)时将上报该事件,应用可以及时处理。
  1. 资源设置:属性url,AVPlay会进入到initialized状态。
  2. 设置窗口:获取并设置SurfaceID属性,用来设置显示的画面,应用需要从XComponent组件中获取SurfaceID
  3. 准备播放:调用prepare()AVPlay进入prepared(准备)状态,这时即可获取duration,并设置缩放、音量等。
  4. 控制视频:播放play()、暂停pause()、跳转seek()、停止stop()等。
  5. 更换资源:只要调用reset()重置资源方法,让AVPlay重新进入idle状态,就可以进行资源url更换。
  6. 退出播放:使用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开发流程,更多精彩内容尽在官方文档,经过半天的编码努力,得到如下成果。

image.png

别问我为什么不放视频因为我不会O_O.