【鸿蒙实战开发】基于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.r
### 鸿蒙系统中使用AVPlayer进行视频播放鸿蒙系统中,`AVPlayer` 是一种功能较为完善的音视频播放解决方案,支持流媒体和本地资源解析、媒体资源解封装、视频解码和渲染等功能。它适用于对媒体资源进行端到端播放的场景,可以直接播放常见的视频格式文件(如 mp4 和 mkv)。以下是关于如何使用 `AVPlayer` 进行视频播放的相关说明。 #### 初始化 AVPlayer 实例 要使用 `AVPlayer` 播放视频,首先需要创建一个 `AVPlayer` 的实例对象。通过该实例可以控制视频的加载、播放、暂停以及其他操作。 ```typescript import media from '@ohos.multimedia.media'; let avPlayer = null; try { avPlayer = media.createAVPlayer(); // 创建 AVPlayer 实例 } catch (error) { console.error('Failed to create AVPlayer instance: ' + error.message); } ``` 上述代码展示了如何初始化 `AVPlayer` 实例[^1]。 #### 设置数据源 为了播放视频,必须指定视频的数据源路径。可以通过 URL 或本地文件路径设置数据源。 ```typescript if (avPlayer) { const videoSource = 'file:///data/local/video.mp4'; // 替换为实际视频路径 try { await avPlayer.setSource({ uri: videoSource }); // 设置数据源 } catch (error) { console.error('Error setting source: ' + error.message); } } ``` 此部分代码用于配置视频的来源地址[^4]。 #### 准备播放器 在正式播放之前,通常需要调用 `prepare()` 方法准备播放环境。这一步会预加载必要的资源并完成初始准备工作。 ```typescript if (avPlayer) { try { await avPlayer.prepare(); // 准备播放 } catch (error) { console.error('Prepare failed: ' + error.message); } } ``` 这是确保播放顺利的关键步骤之一。 #### 控制播放状态 一旦准备好之后,就可以通过调用不同的方法来控制播放的状态,比如开始播放、暂停或者停止。 ```typescript // 开始播放 if (avPlayer) { try { avPlayer.play(); } catch (error) { console.error('Play failed: ' + error.message); } } // 暂停播放 if (avPlayer) { try { avPlayer.pause(); } catch (error) { console.error('Pause failed: ' + error.message); } } // 停止播放 if (avPlayer) { try { avPlayer.stop(); } catch (error) { console.error('Stop failed: ' + error.message); } } ``` 这些函数分别实现了启动、暂停以及终止视频的功能[^3]。 #### 销毁 AVPlayer 实例 当不再需要继续使用 `AVPlayer` 时,应该释放其占用的资源以避免内存泄漏等问题。 ```typescript if (avPlayer) { try { avPlayer.release(); // 销毁 AVPlayer 实例 } catch (error) { console.error('Release failed: ' + error.message); } } ``` 这一过程非常重要,在结束播放后应当及时清理相关资源。 --- ### 注意事项 - 如果计划处理的是网络上的流媒体内容,则需要注意网络连接状况可能会影响播放效果。 - 对于某些特殊格式的支持情况可能会因设备硬件性能差异而有所不同,请提前测试目标平台兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值