我正在尝试在 JavaScript 中使用每个通道的网络摄像头延迟,而我当前的代码运行速度有点慢。你可以在这里看到一个演示
我的延迟方法是创建一个包含 12 个元素的数组来存储像素(画布元素),然后通过复制像素(使用 getImageData 和 putImageData 调用)将内容从一帧转移到另一帧。由于我正在拆分颜色通道,因此我的更新函数如下所示:
function update() {
if (localMediaStream) {
// Update history
for (var i = hs - 1; i > 0; i--) {
var ctxCurr = history[i].getContext('2d');
var ctxPrev = history[i - 1].getContext('2d');
try {
ctxCurr.putImageData(ctxPrev.getImageData(0, 0, w, h), 0, 0);
} catch (err) {
console.log(err);
}
}
// Write the most recent webcam frame
var ctx0 = history[0].getContext('2d');
ctx0.drawImage(video, 0, 0, w, h);
// Get pixel data for most recent,halfway and last frames in history
var r = history[0].getContext('2d').getImageData(0, 0, w, h).data;
var g = history[hs / 2].getContext('2d').getImageData(0, 0, w, h).data;
var b = history[hs - 1].getContext('2d').getImageData(0, 0, w, h).data;
// Get a frame and it's pixels
var imageData = ctx0.getImageData(0, 0, w, h);
var data = imageData.data;
// Write the r,g,b channels using the offset frames for green and blue channels
for (var i = 0; i < data.length; i += 4) {
data[i] = r[i];
data[i + 1] = g[i + 1];
data[i + 2] = b[i + 2];
}
rgb.putImageData(imageData, 0, 0);
}
}
我想我可以跳过使用红色通道,因为最近的帧已经有该信息。是否有更快的方法来操作/写入像素数据(除了getImageData()
and putImageData()
)或更快的方法来实现我想要实现的目标?