【鸿蒙实战开发】基于AVPlayer的视频播放

1 场景描述

示例场景:AVPlayer播放视频ArkTS实现,创建AVPlayer,设置播放资源和窗口,设置播放参数,播放控制(播放/暂停/跳转),重置,销毁资源,播放完成后切换视频。

2 方案描述

AVPlayer:功能较完善的音视频播放ArkTS API,集成了流媒体和本地资源解析,媒体资源解封装,视频解码和渲染功能,适用于对媒体资源进行端到端播放的场景,可 直接播放mp4、mkv等格式的视频文件 。本示例就是使用avplayer进行视频播放的实现,功能包括多种方式播放视频,以及对于视频播放的控制。

具体实现步骤可分为Step1: 调用createAVPlayer()创建AVPlayer实例。Step2: 设置业务需要的监听事件,搭配全流程场景使用。Step3: 设置窗口:获取并设置属性SurfaceID,用于设置显示画面。应用需要从XComponent组件获取surfaceID。同时设置load事件,应该改成并在onload事件回调中完成设置播放资源的操作Step4: 注册avplayer回调函数Step5: 调用相关接口实现播放play(),暂停pause(),跳转seek()等操作。

2.1 创建AVPlayer实例

调用createAVPlayer()创建AVPlayer实例

1.通过url设置网络地址来实现播放


async avPlayerLiveDemo() {

// 创建avPlayer实例对象

let avPlayer: media.AVPlayer = await media.createAVPlayer();

// 创建状态机变化回调函数

this.setAVPlayerCallback(avPlayer);

avPlayer.url = 'https://xxxx; // 播放网络视频

}

}

2.使用fs文件系统打开沙箱地址获取媒体文件地址并通过dataSrc属性进行播放


async avPlayerLiveDemo() {

// 创建avPlayer实例对象

let avPlayer: media.AVPlayer = await media.createAVPlayer();

// 创建状态机变化回调函数

this.setAVPlayerCallback(avPlayer);

avPlayer.url = 'https://sns-video-bd.xhscdn.com/stream/110/258/01e602cadc11542d010370038e7ae8b418_258.mp4'; // 播放网络视频

}

}async avPlayerDataSrcDemo

// 创建avPlayer实例对象

let avPlayer: media.AVPlayer = await media.createAVPlayer();

// 创建状态机变化回调函数

this.setAVPlayerCallback(avPlayer);

// dataSrc播放模式的的播放源地址,当播放为Seek模式时fileSize为播放文件的具体大小,下面会对fileSize赋值

let src: media.AVDataSrcDescriptor = {

fileSize: -1,

callback: (buf: ArrayBuffer, length: number, pos: number | undefined) => {

let num = 0;

if (buf == undefined || length == undefined || pos == undefined) {

return -1;

}

num = fs.readSync(this.fd, buf, { offset: pos, length: length });

if (num > 0 && (this.fileSize >= pos)) {

return num;

}

return -1;

}

}

let context = getContext(this) as common.UIAbilityContext;

// 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例

let pathDir = context.filesDir;

let path = pathDir + '/H264_AAC.mp4';

await fs.open(path).then((file: fs.File) => {

this.fd = file.fd;

})

// 获取播放文件的大小

this.fileSize = fs.statSync(path).size;

src.fileSize = this.fileSize;

avPlayer.dataSrc = src;

}

}

3.使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放


async avPlayerFdSrcDemo() {

// 创建avPlayer实例对象

this.player = await media.createAVPlayer();

// 创建状态机变化回调函数

this.setAVPlayerCallback(this.player);

// 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址

// 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度

let context = getContext(this) as common.UIAbilityContext;

let fileDescriptor = await context.resourc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值