canvas+video实现跨域视频截图并获取截图数据上传到服务器
2020-02-06 12:23
218 查看
canvas+video实现跨域视频截图
这两天在使用canvas+video实现视频截图的时候因为视频是外网地址,所以获取截图数据时会报
Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
看了很多网上的例子都是在
var img = new Image; img.onload = myLoader; img.crossOrigin = 'anonymous'; //可选值:anonymous,*
在这一步的时候做,我做了各种测试发现都不成,最后我发现只要在创建视频的时候加上
videoElem.useCORS=true;//解决跨域 videoElem.crossOrigin="Anonymous";//解决跨域
即可
接下来附上完整代码,让大家少走点坑
<div id="videoDivId" ></div> <canvas id="${videoId}icanvas" width="320" height="570" style="display:none;"></canvas> <div id="output"></div> <button class="layui-btn" id="drawImgBut" >截图</button> <script src="http://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script> <script type="text/javascript"> var videoElem; var videoDiv; //创建视频播放 function createVideo(){ videoElem=document.createElement("video");//创建video videoElem.width="320"; videoElem.height="570"; videoElem.controls=true; videoElem.useCORS=true;//解决跨域 videoElem.crossOrigin="Anonymous";// 这两个参数必填 解决跨域 videoElem.autoplay=false; videoDiv=document.getElementById("videoDivId");//获取video的外层容器 videoDiv.appendChild(videoElem); videoElem.setAttribute('src',"你的视频地址"); } //定时切图 function drawvideo(){ icanvas=document.getElementById("${videoId}icanvas"); var context=icanvas.getContext("2d");//第一个复制video的画布 context.drawImage(videoElem,0,0,videoElem.width,videoElem.height); } //将图片转换成Blob function dataURItoBlob(base64Data) { var byteString; if (base64Data.split(',')[0].indexOf('base64') >= 0) byteString = atob(base64Data.split(',')[1]); else byteString = unescape(base64Data.split(',')[1]); var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]; var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString }); } //截图 function drawimg(){ var firstcanvas=document.getElementById("${videoId}icanvas"); var img = new Image(); var imgBs64 = firstcanvas.toDataURL("image/jpeg"); img.src = imgBs64; imgFile = dataURItoBlob(imgBs64);//该数据为图片数据,可直接上传服务器 output.innerHTML = ""; output.appendChild(img);//显示截图 } window.onload=function(){ createVideo(); setInterval(drawvideo,100); if(parent.isAutoVideo){ setTimeout(function(){drawimg();},1500) } var clickbtn=document.getElementById('drawImgBut'); clickbtn.onclick=function(){ drawimg(); }; } </script>
这这里是一个弹框所以没有写html body 我已经做了修改 加上视频地址就可以独立运行了。
最后说一句,调试过程中经常会遇到修改了js代码不生效的情况,清空缓存和强制刷新多试几次。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- canvas+video实现跨域视频截图
- JS实现预加载视频音频/视频获取截图(返回canvas截图)
- 通过摄像机视频设备或者流媒体服务器SDK获取到数据转换成RTMP流实现网页/手机微信播放
- video用canvas实现截图和上传
- 通过摄像机视频设备或者流媒体服务器SDK获取到数据转换成RTMP流实现网页/手机微信播放
- 通过摄像机视频设备或者流媒体服务器SDK获取到数据转换成RTMP流实现网页/手机微信播放
- 通过Hyperic-hq产品的基础包sigar.jar来实现服务器状态数据的获取
- 纯vc sdk实现http post 方式上传数据到web服务器
- jQuery使用JSONP实现跨域获取数据的三种方法详解
- Ckeditor and ckfinder 配置实现截图上传图片到远程服务器
- iOS-图片上传(第三方服务器)实现图片的上传和获取
- Android实现上传本地或拍摄的视频到Bmob服务器
- struts2+ckeditor+ckfinder实现文件的上传、从数据库获取数据、修改并提交到数据库中保存
- smartupload实现文件上传时获取表单数据
- [PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(四. iOS端代码实现)
- smartupload实现文件上传时获取表单数据
- canvas获取base64图片并上传php服务器
- 用Python实现定时备份Mongodb数据,并上传到FTP服务器
- 解析excel表获取数据,并从远程服务器下载和上传文件
- html Jcrop+canvas实现前端裁剪图片,并上传到服务器