用HTML5制作视频拼图的教程_html5教程技巧
            
   
         
       2015-05-18 13:07:17
                [小 大]
                已经帮助:人解决问题                
                                
             
            
               这篇文章主要介绍了用HTML5制作视频拼图的教程,主要用到了HTML5的Canvas API,需要的朋友可以参考下
 几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画。他让我看下做个DEMO,于是就自己整了一会,也确实不难。用canvas很容易做。所以这篇博文不适合高手看。。。。就是随便写来玩玩的。8EsHTML5中文学习网 - HTML5先行者学习网
效果图:8EsHTML5中文学习网 - HTML5先行者学习网
8EsHTML5中文学习网 - HTML5先行者学习网
至少我刚看到这个的时候觉得挺新颖的,所以才会想到做出来玩玩,觉得楼主out的哥们请轻喷8EsHTML5中文学习网 - HTML5先行者学习网
  不多说,先上DEMO:视频拼图  (或许要等一会才能看到效果,我是直接在w3school那里搞了个视频链接过来的,拖动什么的都做的很简单,或许还有些bug,毕竟就只是做一个DEMO玩玩而已,说说原理就行了),还有一点,直接把视频的当前帧画到canvas中在移动设备上好像还不支持。。。至少我用ipad看了一下,发现画不上去,如果有知道肿么解决这问题的大牛请为小弟解答一下,不甚感激8EsHTML5中文学习网 - HTML5先行者学习网
  原理:每一块拼图就是一个canvas,同时还需要一个离屏canvas。先整一个video标签8EsHTML5中文学习网 - HTML5先行者学习网
</p><p><video id="video" src="http://www.w3school.com.cn/example/html5/mov_bbb.mp4" width="600px" height="400px" controls="control" loop="loop" style="display:block;position:absolute;top:-6000px;"></video></p><p>
8EsHTML5中文学习网 - HTML5先行者学习网并且把video隐藏掉,然后播放视频的时候把每一帧都画到离屏canvas中(离屏canvas就是隐藏了的canvas,用于保存数据),写法很简单:8EsHTML5中文学习网 - HTML5先行者学习网
ctx.drawImage(video , 0 , 0 , vw , vh);
8EsHTML5中文学习网 - HTML5先行者学习网,直接用drawImage方法画上去就行了。为何要先用离屏canvas呢,因为如果直接把每一帧数据同时画到所有拼图块的canvas中,浏览器会瞬间崩掉。所以用一个离屏canvas作为缓冲。先把当前帧的数据保存到canvas,然后再将canvas画到作为拼图块的canvas中。将canvas画到canvas中也很简单,也是用drawImage就可以搞定:8EsHTML5中文学习网 - HTML5先行者学习网
ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);8EsHTML5中文学习网 - HTML5先行者学习网
然后。。。。原理就这么简单,之后提醒一点,用requestAnimationFrame循环取帧时,要限一下速,例如下面所写的,我是每30毫秒取一次,推荐30~50毫秒,太低浏览器容易崩溃,太高的话视频出现卡帧现象了:8EsHTML5中文学习网 - HTML5先行者学习网
 
8EsHTML5中文学习网 - HTML5先行者学习网
function animate(){8EsHTML5中文学习网 - HTML5先行者学习网
            var newTime = new Date();8EsHTML5中文学习网 - HTML5先行者学习网
            if(newTime - lastTime > 30){8EsHTML5中文学习网 - HTML5先行者学习网
                lastTime = newTime;8EsHTML5中文学习网 - HTML5先行者学习网
                ctx.drawImage(video , 0 , 0 , vw , vh);8EsHTML5中文学习网 - HTML5先行者学习网
                canvases.forEach(function(){8EsHTML5中文学习网 - HTML5先行者学习网
                    var ctx2 = this.cas.getContext('2d');8EsHTML5中文学习网 - HTML5先行者学习网
                    ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);8EsHTML5中文学习网 - HTML5先行者学习网
                });8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            if("requestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                requestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("webkitRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                webkitRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("msRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                msRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("mozRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                mozRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
        } 
8EsHTML5中文学习网 - HTML5先行者学习网8EsHTML5中文学习网 - HTML5先行者学习网最后贴出所有代码: 
8EsHTML5中文学习网 - HTML5先行者学习网
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">8EsHTML5中文学习网 - HTML5先行者学习网
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">8EsHTML5中文学习网 - HTML5先行者学习网
<head>8EsHTML5中文学习网 - HTML5先行者学习网
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">8EsHTML5中文学习网 - HTML5先行者学习网
    <style>8EsHTML5中文学习网 - HTML5先行者学习网
        body{margin:0;padding:0;}8EsHTML5中文学习网 - HTML5先行者学习网
        .allCanvas{8EsHTML5中文学习网 - HTML5先行者学习网
            position: relative;8EsHTML5中文学习网 - HTML5先行者学习网
            margin:50px auto;8EsHTML5中文学习网 - HTML5先行者学习网
            width:600px;8EsHTML5中文学习网 - HTML5先行者学习网
        }8EsHTML5中文学习网 - HTML5先行者学习网
        .vcanvas{8EsHTML5中文学习网 - HTML5先行者学习网
            position: absolute;8EsHTML5中文学习网 - HTML5先行者学习网
            display: block;8EsHTML5中文学习网 - HTML5先行者学习网
            border: 1px solid;8EsHTML5中文学习网 - HTML5先行者学习网
        }8EsHTML5中文学习网 - HTML5先行者学习网
    </style>8EsHTML5中文学习网 - HTML5先行者学习网
    <title>视频拼图</title>8EsHTML5中文学习网 - HTML5先行者学习网
</head>8EsHTML5中文学习网 - HTML5先行者学习网
<body>8EsHTML5中文学习网 - HTML5先行者学习网
    <div class="allCanvas">8EsHTML5中文学习网 - HTML5先行者学习网
        <canvas id="liping" width="600" height="400" style="display:none"></canvas>8EsHTML5中文学习网 - HTML5先行者学习网
    </div>8EsHTML5中文学习网 - HTML5先行者学习网
    <video id="video" src="http://www.w3school.com.cn/example/html5/mov_bbb.mp4" width="600px" height="400px" controls="control" loop="loop" style="display:block;position:absolute;top:-6000px;"></video>8EsHTML5中文学习网 - HTML5先行者学习网
    <script>8EsHTML5中文学习网 - HTML5先行者学习网
        var video = document.getElementById("video");8EsHTML5中文学习网 - HTML5先行者学习网
        var cs = document.getElementById("liping");8EsHTML5中文学习网 - HTML5先行者学习网
        var ctx = cs.getContext('2d')8EsHTML5中文学习网 - HTML5先行者学习网
        var rows = 3,8EsHTML5中文学习网 - HTML5先行者学习网
            cols = 3,8EsHTML5中文学习网 - HTML5先行者学习网
            cb = document.querySelector(".allCanvas"),8EsHTML5中文学习网 - HTML5先行者学习网
            vw = 600,8EsHTML5中文学习网 - HTML5先行者学习网
            vh = 400,8EsHTML5中文学习网 - HTML5先行者学习网
            canvases = [];</p><p>        function createCanvas(){8EsHTML5中文学习网 - HTML5先行者学习网
            var num = rows*cols;8EsHTML5中文学习网 - HTML5先行者学习网
            for(var i=0;i<cols;i++){8EsHTML5中文学习网 - HTML5先行者学习网
                for(var j=0;j<rows;j++){8EsHTML5中文学习网 - HTML5先行者学习网
                    var canvas = new vCanvas(Math.random()*600, Math.random()*600 , vw/rows , vh/cols , j , i);8EsHTML5中文学习网 - HTML5先行者学习网
                    canvases.push(canvas);8EsHTML5中文学习网 - HTML5先行者学习网
                }8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
        }</p><p>        var vCanvas = function(x,y,w,h,cols,rows){8EsHTML5中文学习网 - HTML5先行者学习网
            this.x = x;8EsHTML5中文学习网 - HTML5先行者学习网
            this.y = y;8EsHTML5中文学习网 - HTML5先行者学习网
            this.w = w;8EsHTML5中文学习网 - HTML5先行者学习网
            this.h = h;8EsHTML5中文学习网 - HTML5先行者学习网
            this.cols = cols;8EsHTML5中文学习网 - HTML5先行者学习网
            this.rows = rows;8EsHTML5中文学习网 - HTML5先行者学习网
            this.creat();8EsHTML5中文学习网 - HTML5先行者学习网
            this.behavior();8EsHTML5中文学习网 - HTML5先行者学习网
        }8EsHTML5中文学习网 - HTML5先行者学习网
        vCanvas.prototype = {8EsHTML5中文学习网 - HTML5先行者学习网
            creat:function(){8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas = document.createElement("canvas");8EsHTML5中文学习网 - HTML5先行者学习网
                cb.appendChild(this.cas);8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.className = "vcanvas";8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.id = "vc_"+(this.cols+1)*(this.rows+1);8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.style.left = this.x+"px";8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.style.top = this.y+"px";8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.width = this.w;8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.height = this.h;8EsHTML5中文学习网 - HTML5先行者学习网
            },8EsHTML5中文学习网 - HTML5先行者学习网
            behavior:function(){8EsHTML5中文学习网 - HTML5先行者学习网
                this.cas.onmousedown = function(e){8EsHTML5中文学习网 - HTML5先行者学习网
                    e = e || window.event;8EsHTML5中文学习网 - HTML5先行者学习网
                    var that = this;8EsHTML5中文学习网 - HTML5先行者学习网
                    var om = {8EsHTML5中文学习网 - HTML5先行者学习网
                        x:e.clientX,8EsHTML5中文学习网 - HTML5先行者学习网
                        y:e.clientY8EsHTML5中文学习网 - HTML5先行者学习网
                    }8EsHTML5中文学习网 - HTML5先行者学习网
                    window.onmousemove = function(e){8EsHTML5中文学习网 - HTML5先行者学习网
                        e = e || window.event;8EsHTML5中文学习网 - HTML5先行者学习网
                        var nm = {8EsHTML5中文学习网 - HTML5先行者学习网
                            x:e.clientX,8EsHTML5中文学习网 - HTML5先行者学习网
                            y:e.clientY8EsHTML5中文学习网 - HTML5先行者学习网
                        }8EsHTML5中文学习网 - HTML5先行者学习网
                        that.style.left = parseInt(that.style.left.replace("px","")) + (nm.x-om.x) + "px";8EsHTML5中文学习网 - HTML5先行者学习网
                        that.style.top = parseInt(that.style.top.replace("px","")) + (nm.y-om.y) + "px";8EsHTML5中文学习网 - HTML5先行者学习网
                        om = nm;8EsHTML5中文学习网 - HTML5先行者学习网
                    }8EsHTML5中文学习网 - HTML5先行者学习网
                    window.onmouseup = function(){8EsHTML5中文学习网 - HTML5先行者学习网
                        this.onmousemove = null;8EsHTML5中文学习网 - HTML5先行者学习网
                    }8EsHTML5中文学习网 - HTML5先行者学习网
                }8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
        }</p><p>        Array.prototype.forEach = function(callback){8EsHTML5中文学习网 - HTML5先行者学习网
            for(var i=0;i<this.length;i++){8EsHTML5中文学习网 - HTML5先行者学习网
                callback.call(this[i]);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
        }</p><p>        var lastTime = 0;8EsHTML5中文学习网 - HTML5先行者学习网
        function initAnimate(){8EsHTML5中文学习网 - HTML5先行者学习网
            lastTime = new Date();8EsHTML5中文学习网 - HTML5先行者学习网
            createCanvas();8EsHTML5中文学习网 - HTML5先行者学习网
            animate();8EsHTML5中文学习网 - HTML5先行者学习网
        }</p><p>        function animate(){8EsHTML5中文学习网 - HTML5先行者学习网
            var newTime = new Date();8EsHTML5中文学习网 - HTML5先行者学习网
            if(newTime - lastTime > 30){8EsHTML5中文学习网 - HTML5先行者学习网
                lastTime = newTime;8EsHTML5中文学习网 - HTML5先行者学习网
                ctx.drawImage(video , 0 , 0 , vw , vh);8EsHTML5中文学习网 - HTML5先行者学习网
                canvases.forEach(function(){8EsHTML5中文学习网 - HTML5先行者学习网
                    var ctx2 = this.cas.getContext('2d');8EsHTML5中文学习网 - HTML5先行者学习网
                    ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);8EsHTML5中文学习网 - HTML5先行者学习网
                });8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            if("requestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                requestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("webkitRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                webkitRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("msRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                msRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
            else if("mozRequestAnimationFrame" in window){8EsHTML5中文学习网 - HTML5先行者学习网
                mozRequestAnimationFrame(animate);8EsHTML5中文学习网 - HTML5先行者学习网
            }8EsHTML5中文学习网 - HTML5先行者学习网
        }</p><p>        video.play();8EsHTML5中文学习网 - HTML5先行者学习网
        initAnimate();8EsHTML5中文学习网 - HTML5先行者学习网
    </script>8EsHTML5中文学习网 - HTML5先行者学习网
</body>8EsHTML5中文学习网 - HTML5先行者学习网
</html>8EsHTML5中文学习网 - HTML5先行者学习网
 
8EsHTML5中文学习网 - HTML5先行者学习网8EsHTML5中文学习网 - HTML5先行者学习网