当前位置: 首页 > 知识库问答 >
问题:

使用GL Transitions配合REGL做视频转场,不显示视频纹理?

丰飞龙
2024-06-28

在创建视频的时候,如果调用视频的play方法,就能够看到视频:

const video = document.createElement('video');
......
video.oncanplaythrough = ()=>{
  video.play(); //如果不写这句,webGL就无法显示视频纹理
}

请教这是为什么呢?如果我要给很多个视频做转场,那么同时播放多个视频就会很卡……

共有2个答案

缑修齐
2024-06-28

原因是在regl.frame之外获取的纹理:

const texture = regl.texture(video);

regl.frame(...);

应该改为在每一帧中获取:

regl.frame(({time})=>{
  const texture = regl.texture(video);
  ...
});
江奕
2024-06-28

在使用WebGL(或者其封装库如REGL)来显示视频纹理时,通常需要在WebGL的上下文中正确地设置和更新视频纹理。视频纹理是通过将HTML5 <video> 元素的当前帧作为纹理数据传递给WebGL纹理对象来实现的。

关于你的问题,当你说调用 video.play() 后视频纹理才在WebGL中显示,这通常是因为WebGL纹理更新是依赖于视频帧的。在视频没有开始播放(即没有调用 play() 方法)之前,WebGL无法从视频元素中获取到帧数据来更新纹理。

为了解决在多个视频同时播放时可能出现的性能问题,你可以考虑以下几种策略:

  1. 视频预加载:确保在尝试将视频设置为纹理之前,视频已经加载完成。你可以监听 loadeddatacanplay 事件来确认视频已准备好。
  2. 按需播放:不要同时播放所有视频。只播放当前需要显示的视频,并在需要切换时暂停当前视频并开始播放下一个视频。
  3. 使用视频帧缓存:如果你知道视频转场的具体序列,你可以预先将视频的某些帧捕获为纹理并缓存起来,然后在需要时直接使用这些纹理,而不是实时从视频元素中读取。
  4. 优化WebGL设置:确保你的WebGL上下文和纹理设置是优化的。例如,避免不必要的纹理重新绑定和更新,以及使用适当的纹理参数(如 gl.TEXTURE_MIN_FILTERgl.TEXTURE_MAG_FILTER)。
  5. 使用硬件加速:确保你的浏览器和GPU支持WebGL,并且WebGL已启用硬件加速。
  6. 资源管理:如果你有很多视频需要处理,考虑使用资源池来管理视频元素和纹理对象,以便在不再需要时能够正确地释放它们。

以下是一个简化的例子,展示如何在REGL中设置和使用视频纹理(假设你已经有了一个REGL实例 regl):

const video = document.createElement('video');
video.src = 'path/to/your/video.mp4';

video.onloadeddata = () => {
  // 视频加载完成后,创建WebGL纹理
  const texture = regl.texture(video);
  
  // 然后在你的REGL绘制命令中使用这个纹理
  // ...
};

// 当需要播放视频时
video.play();

注意,这个例子只是一个简化的示例,并没有处理所有可能的边界情况和性能优化。在实际应用中,你可能需要根据具体需求进行适当的调整和优化。

 类似资料:
  • 创建一个使用视频来作为贴图的纹理对象。 它和其基类Texture几乎是相同的,除了它总是将needsUpdate设置为true,以便使得贴图能够在视频播放时进行更新。自动创建mipmaps也会被禁用。 代码示例 // assuming you have created a HTML video element with id="video" const video = document.getEl

  • 嘿,伙计们,我一直试图在exoPlayer中显示视频,因为2天,但没有任何进展,请指导我做错了什么。谢谢提前。 这是我对create函数的代码调用。 我的图书馆版本是

  • 前因后果 问题的起因是和一个群友一起讨论,怎么让地球的背景贴上视频,而且地球展开成平面之后,可以拖动实体位置 由于之前几次示例都用了本地的图片(设置 Cesium.Viewer 的imageryProvider 属性)来作背景,这次我很自然的想到了如果使用本地mp4 作为url的值是否可行,结果实践证明这样不行,查看了一下SingleTileImageryProvider的url属性的官方文档,感

  • 问题内容: 我正在尝试将YouTube视频源放入HTML5标签,但似乎不起作用。经过一番谷歌搜索,我发现HTML5不支持YouTube视频URL作为来源。 您可以使用HTML5嵌入YouTube视频吗?如果没有,是否有任何解决方法? 问题答案: 第1步:添加到您喜欢的YouTube网址 步骤2:在来源中寻找标签 第3步:添加到视频标签: 例: 注意那里似乎有些东西。我不知道该字符串可以工作多长时间

  • 我曾尝试使用GStreamer管道将mp4视频转换为avi视频,但它是在没有声音的情况下转换的 gst launch-t-v filesrc location=源。mp4!qtdemux!ffdec\U h264!视频/x-raw-yuv!avimux!filesink location=结果yuv。avi公司

  • 在本机(Java)Android应用程序中,我试图打开一个URL,它是Youtube视频。 我尝试过以不同的有效方式格式化URL,例如: http://www.youtube.com/watch?v=codehere https://www.youtube.com/watch?v=codehere https://youtu.be/codehere 但我总是在Youtube应用程序中出现“此视频不

  • 进入视频页面,在剪辑管理页面,点击+新建合并任务 按钮 弹出视频合并操作界面: 1)点击"添加视频",选择本地视频并添加,根据合并需求可以调整视频的前后顺序; 2)命名合并后视频名称; 3)选择分类; 4)确认合并后,点击提交任务。 任务添加后可在视频页面,点击剪辑管理 查看视频剪辑任务进度 视频剪辑完后,可在视频列表查看剪辑后生成的视频文件。

  • 我正在建立一个应用程序,我需要压缩视频之前,上传到服务器。未经压缩的视频约为五分钟,60M,Android视频位2x1024x1024,640*480。现在我正在使用FFMPEG库压缩视频http://androidwarzone.blogspot.co.il/2011/12/ffmpeg4android.html。以下是command commandStr=“ffmpeg-y-i”+url+“-