js剪辑视频使用gif.js生成GIF效果
效果展示
文件文档及下载地址:
视频上传此处省略,简单说下实现方式,当视频上传完成后,赋值给video,通过监听canplaythrough事件来执行对视频的处理,然后通过画布裁剪为图片数组,然后通过gif.js生成GIF。 video的crossOrigin属性一定要配置,视频要自动播放,否则触发不了canplaythrough事件!
<script type="text/javascript" src="/js/gif.js"></script>//文件引入 //response.object为后端返回的视频url、此处为处理方法 $("#video").attr(src,response.object); $("#video").attr(crossOrigin,Annoymous);//一定要设置,否则会报跨域错误 $(#video)[0].addEventListener("canplaythrough", function (evt) { //要执行的函数内容 console.log(evt) console.log($(#video)[0].duration+秒) console.log(宽:+$(#video)[0].videoWidth + 高:+$(#video)[0].videoHeight); myFunction()//GIF生成事件 });
function myFunction(){ $(#output).children().remove()//接收画布生成图片的数组 $(.imgDiv).children().remove()//动图展示标签 var audioElement = new Audio($(#video)[0].src);//audio也可获取视频的时长 var duration; var often =5;//生成GIF截取的视频长度 audioElement.addEventListener("loadedmetadata", function (_event) { duration = audioElement.duration; if (duration<5){ $.messager.progress(close); $.messager.show({ title : "提示", msg : 视频内容太短,请重新上传 }); } }); //GIF生成主要方法 var time=setInterval(()=>{ if($(#video)[0].currentTime>5) { clearInterval(time) var gif = new GIF({ workers: 1, quality: 1, width: $(#video)[0].videoWidth,//GIF宽高保持一致,防止失真 height: $(#video)[0].videoHeight, workerScript: /js/gif.worker.js }); for(var i=0; i<$(#output img).length; i++){ gif.addFrame($(#output img)[i],{ copy:true,delay:110});//复制像素,延迟 } console.log(生成gif中。。) gif.on(finished, function(blob) { // window.open(URL.createObjectURL(blob)); //生成图片链接 var url = URL.createObjectURL(blob); console.log(url) var img = document.createElement("img"); img.src=url $(.imgDiv).append(img)//页面展示 }) gif.render() }else{ var canvas = document.createElement("canvas"); var output = document.getElementById("output"); canvas.width = $(#video)[0].videoWidth; canvas.height = $(#video)[0].videoHeight; canvas.getContext(2d).drawImage($(#video)[0], 0, 0, canvas.width, canvas.height); var img = document.createElement("img"); img.src = canvas.toDataURL("image/png"); output.appendChild(img); } },100) }