3

我正在尝试在 JavaScript 中实现延迟的网络摄像头查看器,将 Three.js 用于 WebGL 功能。

我需要存储从网络摄像头抓取的帧,以便它们可以在一段时间后显示(几毫秒到几秒)。我可以在没有 Three.js 的情况下使用canvasand来做到这一点getImageData()。您可以在 jsfiled 上找到一个示例

我正在尝试找到一种无需画布但使用 Three.jsTextureDataTexture对象的方法。这是我正在尝试的示例。问题是我找不到如何将图像从Textureimage类型HTMLVideoElement)复制到另一个。

rotateFrames()功能上,旧帧应该丢失,新帧应该替换,就像在 FIFO 中一样。但是线

frames[i].image = frames[i + 1].image;

只是复制参考,而不是纹理数据。我想DataTexture应该这样做,但我无法DataTexture摆脱 a Textureor HTMLVideoElement

任何的想法?

警告:您必须有一个摄像头并允许浏览器使用它来获取示例工作。显然,您必须有一个更新的浏览器。

4

1 回答 1

2

这是你要找的吗??

http://fiddle.jshell.net/m4Bh7/10/

编辑:

function onFrame(dt) {
    if (video.readyState === video.HAVE_ENOUGH_DATA) { /* new frame available from webcam */
        context.drawImage(video, 0, 0,videoWidth,videoHeight);
        frames[framesNum - 1].image.data = new Uint8Array(context.getImageData(0,0,videoWidth, videoHeight).data.buffer);
        frames[framesNum - 1].needsUpdate = true;
    }
}

这是最重要的部分:它制作帧的副本并将其作为数据保存在 dataTexture 中。

function rotateFrames() {
    for (var i = 0; i != framesNum - 1; ++i) {
/*
         * FIXME: this does not work!
         */
        frames[i].image.data = frames[i + 1].image.data;
        frames[i].needsUpdate = true;
    }
}

然后,这会将数据从纹理复制到帧中的纹理。

新版本:http://fiddle.jshell.net/hWL2E/4/

function onFrame(dt) {
    if (video.readyState === video.HAVE_ENOUGH_DATA) { /* new frame available from webcam */
        context.drawImage(video, 0, 0,videoWidth,videoHeight);
         var frame = new THREE.DataTexture(new Uint8Array(context.getImageData(0,0,videoWidth, videoHeight).data.buffer) ,videoWidth,videoHeight);
        frames[framesNum - 1] = frame;
        frames[framesNum - 1].needsUpdate = true;
        sprites[framesNum - 1].map = frames[framesNum - 1];
    }
}

它为视频图像的每一帧生成一个新的纹理。

function rotateFrames() {
    for (var i = 0; i != framesNum - 1; ++i) {
/*
         * FIXME: this does not work!
         */
        frames[i] = frames[i + 1];
        sprites[i].map = frames[i];

    }
}

这就是让它变得更好的原因。因为它重用了使用过的纹理,这意味着它不需要重新发送到 GPU。

于 2012-09-26T12:58:11.443 回答