【发布时间】:2017-04-10 09:25:14
【问题描述】:
我正在运行 mjpeg 流媒体并尝试将流设置为 three.js 中的纹理。
我通过将其写入画布然后将画布作为纹理来做到这一点。 但是,我得到一个受污染的画布错误。
DOMException: Failed to execute 'texImage2D' on 'WebGLRenderingContext':
Tainted canvases may not be loaded.
我已经在服务器上添加了crossOrigin头,它被接收为:
Access-Control-Allow-Origin:*
Content-type:multipart/x-mixed-replace; boundary=--jpgboundary
Date:Tue, 04 Apr 2017 22:27:35 GMT
Server:BaseHTTP/0.3 Python/2.7.9**strong text**
在客户端我添加了适当的 crossOrigin 属性
<p>Image to use:</p>
<img id="stream" crossorigin="anonymous"
src="http://192.168.1.224:8080/cam.mjpg">
<p>Canvas:</p>
<canvas id="myCanvas" width="200" height="200" style="border:1px solid
#d3d3d3;">
Your browser does not support the HTML5 canvas tag.
</canvas>
function updateCanvas() {
var c = document.getElementById("myCanvas");
var ctx2 = c.getContext("2d");
var img = document.getElementById("stream");
img.crossOrigin = "anonymous";
ctx2.drawImage(img, 0, 0);
}
有没有人知道这里有什么不好的地方?
编辑:对不起,我应该澄清一下,把它放在画布上工作正常,问题是当我尝试将该画布用作纹理时,画布被污染并且失败
function init() {
renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(70, width / height, 1, 1000);
camera.position.z = 500;
scene.add(camera);
window.setTimeout("updateCanvas()", 1000); //start with a delay
texture = new THREE.Texture(canvas);
var material = new THREE.MeshBasicMaterial({ map: texture });
geometry = new THREE.BoxGeometry( 200, 200, 200 );
mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
canvas.width = canvas.height = size;
renderer.setClearColor(0xeeeeee, 1);
}
function animate() {
requestAnimationFrame(animate);
updateCanvas();
texture.needsUpdate = true;
mesh.rotation.y += 0.01;
renderer.render(scene, camera);
}
【问题讨论】:
-
我不是在 src 之前设置 crossOrigin 属性吗?稍后我还会在我的代码中反复调用 updateCanvas,以更新下一帧。
-
@gman ,你知道
gl.texImage2D在<img>的动画媒体上是否与context2d.drawImage()具有相同的limitations 吗? -
texImage2D比drawImage更严格。drawImage可以在没有 CORS 权限的情况下拍摄跨域图像。这样做会将画布标记为脏。texImage2D未经许可不会跨域镜像。 WebGL 画布永远不会脏,因为没有 CORS 许可期限就不能使用跨域图像。 -
@gman,抱歉,我确实将讨论分开,并对您的回答发表了评论。如果用于纹理的 2d 画布之前被污染,那么 texImage2d 将无法正常工作?那么这可能是OP的问题。但我的问题是他甚至需要穿过 2d 画布吗? texImage2d 可以处理动画图像吗,不像 drawImage?
-
正确,通过画布传递跨域非 CORS 许可视频将不起作用。穿过画布对 AFAIK 没有任何作用,除了可能让您在上传到纹理之前缩放视频。您可以使用a video tag directly with texImage2D。虽然最近有a bug in Chrome currently being fixed
标签: canvas http-headers cors webgl