【发布时间】:2016-05-16 14:45:04
【问题描述】:
我在 Chrome 中获取视频屏幕截图时遇到问题,我已经用尽了所有互联网和 Stackoverflow 上的所有答案;不走运。
无论我尝试什么,当我尝试使用 canvas 元素对位于不同域甚至不同端口上的视频进行屏幕截图时,我最终都会遇到 Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. 错误.
这是我的设置:
网络应用网址
http://client.myapp.com/home.html
CDN 网址(我都试过了)
http://client.myapp.com:8181/somevideo.mp4
http://cdn.myapp.com/somevideo.mp4
从 CDN 与 MP4 一起发回的标头:
Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:x-ms-request-id,Server,x-ms-version,Content-Type,Last-Modified,ETag,x-ms-lease-status,x-ms-lease-state,x-ms-blob-type,Accept-Ranges,Content-Length,Date,Transfer-Encoding
Content-Length:5253832
Content-Range:bytes 48-5253879/5253880
Content-Type:video/mp4
Date:Sat, 06 Feb 2016 17:24:05 GMT
ETag:"0x8D32E3EDB17EC00"
Last-Modified:Fri, 05 Feb 2016 15:13:08 GMT
Server:Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-blob-type:BlockBlob
x-ms-lease-state:available
x-ms-lease-status:unlocked
x-ms-request-id:88d3aaef-0629-4316-995f-021aa0153c32
x-ms-version:2015-04-05
我有:
- 在视频元素中添加了
crossOrigin="anonymous",但这只会导致视频完全加载失败 - 甚至在不同的端口上尝试过相同的域(如上)
- 确保
Access-Control-Allow-Origin与*一起返回(如上) - 我不相信它是 DRM,因为如果我将完全相同的视频文件复制到 Web 应用程序并在本地加载它,屏幕截图可以正常工作
- 遍历this question 的所有答案,但这是针对图像而不是视频,并且答案仅描述了前面的所有要点
然而,仍然是该死的错误。
编辑
添加代码:
var getScreenshotDataUrl = function(video, canvas, type) {
type = type || "image/jpeg";
var context = canvas.getContext("2d");
var w = video.videoWidth;
var h = video.videoHeight;
canvas.width = w;
canvas.height = h;
context.fillRect(0, 0, w, h);
context.drawImage(video, 0, 0, w, h);
video.crossorigin = "anonymous";// makes no difference
return canvas.toDataURL(type);
}
请帮忙。
【问题讨论】:
-
能否请您在此处发布您的代码,而不是此处的链接。
-
@Binvention 我已经添加了代码。它适用于非 CORS。
-
图片标题中的 env=IS_CORS 怎么样?
标签: javascript html video canvas