【发布时间】:2012-09-17 04:06:48
【问题描述】:
我正在尝试在 javascript 中实现延迟的网络摄像头查看器,使用 Three.js 实现 WebGL 功能。
我需要存储从网络摄像头抓取的帧,以便它们可以在一段时间后显示(几毫秒到几秒)。我可以在没有 Three.js 的情况下使用canvas 和getImageData() 来做到这一点。你可以找到an example on jsfidle。
我正在尝试找到一种无需画布但使用 Three.js Texture 或 DataTexture 对象的方法。 Here an example of what I'm trying。问题是我找不到如何将图像从Texture(image 的类型为HTMLVideoElement)复制到另一个。
在rotateFrames() 函数中,旧帧应该丢失,新帧应该替换,就像在 FIFO 中一样。但是这条线
frames[i].image = frames[i + 1].image;
只是复制参考,而不是纹理数据。我猜DataTexture 应该这样做,但我无法从Texture 或HTMLVideoElement 中得到DataTexture。
有什么想法吗?
警告:您必须有一个摄像头并允许浏览器使用它来获取示例工作。显然,您必须有一个更新的浏览器。
【问题讨论】:
-
不确定我明白了,但应该有一种方法可以做到这一点,而无需手动复制字节,只需旋转指针。我有一个类似的项目,并使用了多个屏幕外画布和内置的 drawImage() 来传输到屏幕。这非常快,因为 Chrome 直接在 GPU 上完成所有工作。所以,如果你想使用 shaders/three.js,我会准备最终的画布并更新纹理。这有意义吗?
-
是的,我在一个类似的 C++ 项目中做过这个。旋转指针是正确的方式,see this image。但是每个新帧都需要复制到图像历史数组(每次都在不同的位置)。如果不复制数据而只复制指针,则会丢失旧帧,因为每个指针都会指向较新的帧,
标签: javascript html5-canvas webgl three.js