需要背景
经营共事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>
发表回复