视频纹理

有时候我们需要将视频放入场景中进行渲染,使用视频纹理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方法释放!!!