需要背景
经营共事PC端公布的视频,能够间接在视频中抉择工夫,将以后工夫的帧,作为视频的封面图。在这个过程中遇到了跨域问题,时间轴同步问题,video标签跨域问题,前端视频缓存问题
指标成果
遇到的问题
1.本地抉择视频能够实现截图,OSS中的视频会爆跨域问题,无奈实现截图
本地抉择的视频是blob格局是没问题的,而OSS中抉择的视频域名和PC端管理系统的域名不雷同,导致呈现问题。解决办法:在OSS中设置跨域规定
2.后端跨域解决之后,前端渲染的video组件无奈胜利执行截图办法,会报错
本地渲染的视频地址曾经被浏览器缓存,导致报错。解决办法:应用js创立一个dispaly:"none"的视频video,咱们叫他new_video new_video的URL地址沿用video的视频地址加上随机数(加随机数的目标是避免被缓存),最重要的一点new_video要设置crossOrigin属性
3.批改video的时间轴,要联动批改new_video的时间轴
解决办法:减少一个对old_video的监听办法,动静赋值
代码
<!doctype html><html lang="zh-CN"><head> <title>OSS跨域视频截取封面图实现计划</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no,maximum-scale=1,minimum-scale=1"></head><style> #output img { border: 1px solid red; } #video { width: 200px; } #new_video { display: none; }</style><body><video id="video" controls="controls"> <source id="src" src="http://cdn.domain.com/set/nice_bird.mp4"></video><video id="new_video"></video><button id="capture">截取封面图</button><div id="output"></div><script src="jquery.js"></script><script> $(function () { let old_video, output; output = document.getElementById('output'); old_video = document.getElementById("video"); // 监听按钮点击事件 $('#capture').on('click', function () { captureImage(); }) // 获取新的视频 let new_video = document.getElementById('new_video') // 获取老的视频链接地址 let url = $("#src").attr("src") // 重点 为新video的src赋值 这里给URL减少后缀是避免浏览器对视频进行缓存,否则截图无奈胜利 new_video.src = url + "?t=" + new Date(); // 重点 此处新video的视频进度如果是0则无奈截取图片,随便这是一个比0大的数字即可 new_video.currentTime = 0.000001 // 重点 开启跨域反对 new_video.crossOrigin = 'anonymous'; // 重点 应用事件监听形式捕获事件(通过扭转老的视频播放工夫扭转新的视频播放工夫) old_video.addEventListener("timeupdate", function () { new_video.currentTime = old_video.currentTime }, false); // 截图函数 let captureImage = function () { let canvas = document.createElement("canvas"); canvas.width = new_video.videoWidth * 0.5; canvas.height = new_video.videoHeight * 0.5; console.log('宽', new_video.videoWidth, '高', new_video.videoHeight); // 将所截图片绘制到canvas上,并转化成图片 canvas.getContext('2d').drawImage(new_video, 0, 0, canvas.width, canvas.height); let image = document.createElement('img'); //将base64传递给image.src image.src = canvas.toDataURL(); // 打印图片base64字符串 console.log(canvas.toDataURL()); //增加到展现区域 output.prepend(image); } })</script></body></html>