有时候我们需要将视频放入场景中进行渲染,使用视频纹理VideoTexture资源就可以实现这个需求。视频纹理本质上是创建一个普通纹理,然后定时用视频解码数据对它进行更新。
通过加载器
视频纹理的创建也可以通过加载的方式创建。用xml加载:
<xr-asset-load
type="video-texture" asset-id="vt" src="/assets/video.mp4"
options="autoPlay:true,loop:true,abortAudio:false,placeHolder:/assets/video.jpg"
/>
或是使用代码加载:
scene.assets.loadAsset({
type: 'video-texture', assetId: 'vt', src: '/assets/video.mp4',
options: {autoPlay: true}
});
注意到视频纹理的几个选项,autoPlay开启后视频加载成功时会自动播放,loop开启时会循环播放,abortAudio用于指定是否要禁止声音(默认禁止),placeHolder则是作为视频尚未加载成功时的一个占位图,可选。
特别注意,
placeHolder的尺寸必须和视频完全一致!!!
代码创建
视频纹理也可以手动在代码中创建:
const vt = await createVideoTexture({src, autoPlay, loop, placeHolder});
注意这是个异步方法,在有placeHolder时会在图片加载完毕时返回,否则将在视频准备好时返回。
控制
视频纹理对于开发者而言主要是视频,所以我们提供了一些用于控制视频播放的方法:
// 开始播放,异步方法
await vt.play();
// 从`pos`秒开始播放,异步方法
await vt.seek(pos);
// 停止播放
vt.stop();
// 释放视频
vt.release();
// 在播放结束并且非loop的情况下,会执行
vt.onEnd = () => {};
// 在基础库`v2.33.0`及以上,提供了暂停/唤醒方法
// 同时可以配合新暴露的播放状态使用
const xrSystem = wx.getXrFrameSystem();
if (vt.state === xrSystem.EVideoState.Playing) {
vt.pause();
} else if (vt.state === xrSystem.EVideoState.Paused) {
vt.resume();
}
注意,如果是自己创建的视频资源,请务必自己调用release方法释放!!!