orillusion的视频材质,也许这样可以丝滑一些
-
// 创建视频纹理 const videoTexture = new VideoTexture(); await videoTexture.load("https://cdn.orillusion.com/videos/bunny.mp4"); // 创建视频材质 const mat = new VideoMaterial(); mat.baseMap = videoTexture; mat.debug(); // 创建2D平面 const planeObj = new Object3D(); const mr = planeObj.addComponent(MeshRenderer); mr.geometry = new PlaneGeometry(20, 11, 20, 11, Vector3.Z_AXIS); mr.material = mat; mr.onBeforeUpdate(() => { videoTexture.media.pause(); videoTexture.media.play(); }) scene.addChild(planeObj);
在做上面的改造后,video 会变的很丝滑
-
@OldGong Thanks for the tips
经测试这种手动 pause&play 的方法会造成额外的 cpu 消耗,而且会造成 DOM 数量激增,不停的触发 gc,所以不建议这种操作可以利用最新的原生 WebCodecs VideoFrame API https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame 来刷新视频帧缓存,可以达到一样的效果,几乎不影响 cpu 和 dom 内存
类似每帧强制更新video缓存:
mr.onBeforeUpdate(() => { // force video decoding at current time let frame = new VideoFrame(videoTexture.media) // just release the frame, we don't actually need it frame.close() })
当然在
@orillusion/media-extension@0.2.2
中已经更新了这个逻辑,不用手动调用了其实最新的 WebGPU 标准可以直接从 VideoFrame 获取视频帧信息,这种方式性能更好,但目前这个 API 还在测试阶段,需要浏览器开启额外的
WebGPU Developer Features
支持, 我们会持续关注,等开放权限后会及时更新相关特性