web实战:video结合canvas实现视频在线截图
给⼤家讲解下我前⼏天看到的⼀个有趣⼩demo:视频在线截图。以下是我修改和添加了新功能后的效果图:
是不是很酷,其实挺简单的,下⾯就给⼤家讲讲怎么弄哈。
这⾥主要分为三⼤块功能,⾸先是第⼀个:
利⽤URL对象获取视频链接并展⽰:
js的URL对象有个createObjectURL⽅法,它可以获取⼀个⽂件(File对象)的url,然后插⼊到video元素的src特性中,这样就可以实现视屏的展⽰了。当然如何获取File对象呢,⽅法有种,⽐如使⽤input元素,或者使⽤拖动的⽅式。⼀个完整的代码段:
<input type="file"/>
复制代码
document.querySelector('input[type="file"]').addEventListener('change',function () {
document.querySelector('video').src = ateObjectURL(this.files[0])
})复制代码
当然源码中我并不是这样写的,仅仅是为了给⼤家⼀个演⽰⽽已。关于URL更加具体的使⽤,⼤家可以看看或者MDN。
利⽤canvas实现视频截图:
接下来就是关键步骤了,但也很简单,那就是使⽤canvas的drawImage⽅法,⼤家如果翻到⾼程三的第15.2.6节,就会发现drawImage的⽅法的使⽤描述得⾮常详细,但漏讲了⼀个,那就是video元素也可传⼊drawImage⽅法中,并且绘制图形。具体代码段:
jquery源码在线
var canvas = ateElement("canvas");
var canvasCtx = Context("2d");
var video=document.querySelector('video');复制代码
//坐原图像的x,y轴坐标,⼤⼩,⽬标图像的x,y轴标,⼤⼩。
canvasCtx.drawImage(video, 0, 0, videoWidth, videoHeight, 0, 0, imgWidth, imgHeight);
//把图标base64编码后变成⼀段url字符串
var dataUrl = DataURL("image/png");
//插⼊图⽚得src特性中
绘制完成图像后,再调⽤canvas的toDataURl⽅法把图像变成base64编码的url,就可插⼊到img元素中展⽰,⼀个缩略的图的制作便完成了。关于图⽚和base64的关系,具体的同学们可以看下。
实现动画效果:
该动画实现的主要原理是:先在视频原处创建⼀张⼤⼩和视频⼀致的⼤图⽚,设置为绝对布局(position:absolut),在实际放置缩略图处创建⼀张⼩图⽚,设置为不可见(visibility:hidden),然后⼤图⽚通过left和top实现位移,width和height实现缩⼩,⾄实际放置缩略图处,并形成动画效果。最后⼤图⽚删除,⼩图⽚显⽰即可。具体代码段:
function getOffset(elem) {
var pos = {x: elem.offsetLeft, y: elem.offsetTop};
var offsetParent = elem.offsetParent;
while (offsetParent) {
pos.x += offsetParent.offsetLeft;
pos.y += offsetParent.offsetTop;
offsetParent = offsetParent.offsetParent;
}
return pos;
}复制代码
该函数是获取⼩图⽚距viewport(视⼝)的距离,并提供给⼤图⽚作为位移参数的,⾼程三的12.2.3节有段⼏乎⼀模⼀样的代码,并附有详细说明,以及替代⽅案getBoundingClientRect函数也有提到,具体的⼤家翻书看看哈。
下⾯的代码便是创建⼤图⽚和⼩图⽚并实现动画效果了。为了⽅便易懂,我这⼉使⽤了JQuery
var $imgBig = $("<img/>");
//设置⼤图⽚的初始位置,就是原视频处。
$imgBig.css({
position: "absolute",
left: video.offsetLeft,
top: video.offsetTop,
width: video.offsetWidth+ "px",
height: video.offsetHeight+ "px"
}).attr("src", dataUrl);复制代码
var $img = $("<img/>");
$img.hide();
//获取⼩图⽚的距离参数,实现⼤图⽚的动画效果。
var offset = getOffset($img[0]);
//添加动画效果
$imgBig.animate({
left: offset.x + "px",
top: offset.y + "px",
width: $img.width() + "px",
height: $img.height() + "px"
}, 500, function () {
$img.show();
$ve();
});复制代码
恩恩,主要的代码部分到这就讲完啦,当然具体的实现还有很多细节上的问题以及其他的功能可能没有展⽰,我就不⼀⼀说明了,具体的⼤家看完源码后可以再提问。
下⾯是我的源码地址,⼤家可以试试哈:
还有就是我参考的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。