返回顶部
首页 > 资讯 > 前端开发 > html >如何用HTML5制作视频拼图
  • 840
分享到

如何用HTML5制作视频拼图

2024-04-02 19:04:59 840人浏览 薄情痞子
摘要

本篇内容介绍了“如何用HTML5制作视频拼图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!几天前同事给我看

本篇内容介绍了“如何用HTML5制作视频拼图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画。他让我看下做个DEMO,于是就自己整了一会,也确实不难。用canvas很容易做。所以这篇博文不适合高手看。。。。就是随便写来玩玩的。
效果图:
如何用HTML5制作视频拼图

至少我刚看到这个的时候觉得挺新颖的,所以才会想到做出来玩玩,觉得楼主out的哥们请轻喷

  不多说,先上DEMO:视频拼图  (或许要等一会才能看到效果,我是直接在w3school那里搞了个视频链接过来的,拖动什么的都做的很简单,或许还有些bug,毕竟就只是做一个DEMO玩玩而已,说说原理就行了),还有一点,直接把视频的当前帧画到canvas中在移动设备上好像还不支持。。。至少我用ipad看了一下,发现画不上去,如果有知道肿么解决这问题的大牛请为小弟解答一下,不甚感激

  原理:每一块拼图就是一个canvas,同时还需要一个离屏canvas。先整一个video标签

代码如下:

<p><video id="video" src="Http://www.w3school.com.cn/example/html5/mov_bbb.mp4" width="600px" height="400px" controls="control" loop="loop" ></video></p>

并且把video隐藏掉,然后播放视频的时候把每一帧都画到离屏canvas中(离屏canvas就是隐藏了的canvas,用于保存数据),写法很简单:

代码如下:

ctx.drawImage(video , 0 , 0 , vw , vh);

,直接用drawImage方法画上去就行了。为何要先用离屏canvas呢,因为如果直接把每一帧数据同时画到所有拼图块的canvas中,浏览器会瞬间崩掉。所以用一个离屏canvas作为缓冲。先把当前帧的数据保存到canvas,然后再将canvas画到作为拼图块的canvas中。将canvas画到canvas中也很简单,也是用drawImage就可以搞定:

ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);

然后。。。。原理就这么简单,之后提醒一点,用requestAnimationFrame循环取帧时,要限一下速,例如下面所写的,我是每30毫秒取一次,推荐30~50毫秒,太低浏览器容易崩溃,太高的话视频出现卡帧现象了:

 

代码如下:

function animate(){            var newTime = new Date();            if(newTime - lastTime > 30){                lastTime = newTime;                ctx.drawImage(video , 0 , 0 , vw , vh);                canvases.forEach(function(){                    var ctx2 = this.cas.getContext('2d');                    ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);                });            }            if("requestAnimationFrame" in window){                requestAnimationFrame(animate);            }            else if("WEBkitRequestAnimationFrame" in window){                webkitRequestAnimationFrame(animate);            }            else if("msRequestAnimationFrame" in window){                msRequestAnimationFrame(animate);            }            else if("mozRequestAnimationFrame" in window){                mozRequestAnimationFrame(animate);            }        }


最后贴出所有代码: 

代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <style>
        body{margin:0;padding:0;}
        .allCanvas{
            position: relative;
            margin:50px auto;
            width:600px;
        }
        .vcanvas{
            position: absolute;
            display: block;
            border: 1px solid;
        }
    </style>
    <title>视频拼图</title>
</head>
<body>
    <div class="allCanvas">
        <canvas id="liping" width="600" height="400" ></canvas>
    </div>
    <video id="video" src="http://www.w3school.com.cn/example/html5/mov_bbb.mp4" width="600px" height="400px" controls="control" loop="loop" ></video>
    <script>
        var video = document.getElementById("video");
        var cs = document.getElementById("liping");
        var ctx = cs.getContext('2d')
        var rows = 3,
            cols = 3,
            cb = document.querySelector(".allCanvas"),
            vw = 600,
            vh = 400,
            canvases = [];</p>
<p>        function createCanvas(){
            var num = rows*cols;
            for(var i=0;i<cols;i++){
                for(var j=0;j<rows;j++){
                    var canvas = new vCanvas(Math.random()*600, Math.random()*600 , vw/rows , vh/cols , j , i);
                    canvases.push(canvas);
                }
            }
        }</p>
<p>        var vCanvas = function(x,y,w,h,cols,rows){
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
            this.cols = cols;
            this.rows = rows;
            this.creat();
            this.behavior();
        }
        vCanvas.prototype = {
            creat:function(){
                this.cas = document.createElement("canvas");
                cb.appendChild(this.cas);
                this.cas.className = "vcanvas";
                this.cas.id = "vc_"+(this.cols+1)*(this.rows+1);
                this.cas.style.left = this.x+"px";
                this.cas.style.top = this.y+"px";
                this.cas.width = this.w;
                this.cas.height = this.h;
            },
            behavior:function(){
                this.cas.onmousedown = function(e){
                    e = e || window.event;
                    var that = this;
                    var om = {
                        x:e.clientX,
                        y:e.clientY
                    }
                    window.onmousemove = function(e){
                        e = e || window.event;
                        var nm = {
                            x:e.clientX,
                            y:e.clientY
                        }
                        that.style.left = parseInt(that.style.left.replace("px","")) + (nm.x-om.x) + "px";
                        that.style.top = parseInt(that.style.top.replace("px","")) + (nm.y-om.y) + "px";
                        om = nm;
                    }
                    window.onmouseup = function(){
                        this.onmousemove = null;
                    }
                }
            }
        }</p>
<p>        Array.prototype.forEach = function(callback){
            for(var i=0;i<this.length;i++){
                callback.call(this[i]);
            }
        }</p>
<p>        var lastTime = 0;
        function initAnimate(){
            lastTime = new Date();
            createCanvas();
            animate();
        }</p>
<p>        function animate(){
            var newTime = new Date();
            if(newTime - lastTime > 30){
                lastTime = newTime;
                ctx.drawImage(video , 0 , 0 , vw , vh);
                canvases.forEach(function(){
                    var ctx2 = this.cas.getContext('2d');
                    ctx2.drawImage(cs , -this.cols*this.w , -this.rows*this.h , vw , vh);
                });
            }
            if("requestAnimationFrame" in window){
                requestAnimationFrame(animate);
            }
            else if("webkitRequestAnimationFrame" in window){
                webkitRequestAnimationFrame(animate);
            }
            else if("msRequestAnimationFrame" in window){
                msRequestAnimationFrame(animate);
            }
            else if("mozRequestAnimationFrame" in window){
                mozRequestAnimationFrame(animate);
            }
        }</p>
<p>        video.play();
        initAnimate();
    </script>
</body>
</html>

“如何用HTML5制作视频拼图”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何用HTML5制作视频拼图

本文链接: https://lsjlt.com/news/76532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用HTML5制作视频拼图
    本篇内容介绍了“如何用HTML5制作视频拼图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!几天前同事给我看...
    99+
    2024-04-02
  • 如何使用html5制作loading图
    小编给大家分享一下如何使用html5制作loading图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 代码如下: <...
    99+
    2024-04-02
  • canvas与html5如何实现视频截图功能
    这篇文章主要介绍了canvas与html5如何实现视频截图功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。制作方法:1.在页面中加载视频在...
    99+
    2024-04-02
  • Html5 webRTC如何实现视频调用
    这篇文章主要介绍Html5 webRTC如何实现视频调用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!示例代码:<template>  <video id="...
    99+
    2023-06-09
  • HTML5中如何显示视频
    这篇文章主要讲解了“HTML5中如何显示视频”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5中如何显示视频”吧! 今天...
    99+
    2024-04-02
  • HTML5 中如何嵌入视频?
    这篇文章将为大家详细讲解有关HTML5 中如何嵌入视频?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HTML5中嵌入视频 HTML5中的<video>元素可用于在网页中嵌入视频文件。以下步骤...
    99+
    2024-04-02
  • 用python复制图片、视频
    f_src = open('1.jpg','rb') content = f_src.read() f_copy = open('1-副本.jpg','wb') f_copy.write(content) #f_copy.write(...
    99+
    2023-01-31
    图片 视频 python
  • FFmpeg:如何制作 MP4 CENC(通用加密)视频
    要制作一个使用CENC(通用加密)的MP4视频,您可以使用FFmpeg工具来完成。下面是一些基本的步骤:1. 安装FFmpeg工具:...
    99+
    2023-09-27
    FFmpeg
  • html5+CSS3如何实现优酷视频截图效果
    这篇文章主要介绍html5+CSS3如何实现优酷视频截图效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一般的视频网站对于用户上传的视频,在用户上传完成后,可以对播放的视频进行截图...
    99+
    2024-04-02
  • HTML5+CSS3如何模仿优酷视频截图功能
    这篇文章给大家分享的是有关HTML5+CSS3如何模仿优酷视频截图功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:看起来还是很不错,下面我给大家分析下,极其核心代码很简...
    99+
    2024-04-02
  • html5如何实现播放视频且动态截图
    小编给大家分享一下html5如何实现播放视频且动态截图,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 暂不支持chrom 。支持safari .其他未测试 先...
    99+
    2024-04-02
  • html5如何实现视频播放
    这篇文章主要为大家展示了“html5如何实现视频播放”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html5如何实现视频播放”这篇文章吧。一、html5技术优势...
    99+
    2024-04-02
  • windows会声会影x7如何制作视频
    这篇文章主要介绍“windows会声会影x7如何制作视频”,在日常操作中,相信很多人在windows会声会影x7如何制作视频问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”windows会声会影x7如何制作视频...
    99+
    2023-07-01
  • 如何使用Echarts制作可视化图表
    这期内容当中小编将会给大家带来有关如何使用Echarts制作可视化图表,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最近在结合新学的爬虫在做一些可视化的东西了,今天讲讲可视化图表相关的。关于可视化工具:E...
    99+
    2023-06-19
  • 如何使用HTML5和CSS3制作日历图标
    这篇文章主要讲解了“如何使用HTML5和CSS3制作日历图标”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用HTML5和CSS3制作日历图标”吧! ...
    99+
    2024-04-02
  • windows会声会影拜年视频如何制作
    这篇文章主要介绍“windows会声会影拜年视频如何制作”,在日常操作中,相信很多人在windows会声会影拜年视频如何制作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”windows会声会影拜年视频如何制作...
    99+
    2023-07-01
  • windows会声会影分身视频如何制作
    这篇文章主要讲解了“windows会声会影分身视频如何制作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows会声会影分身视频如何制作”吧!会声会影分身视频制作方法首先我们记录下每个...
    99+
    2023-07-01
  • 如何用python反转图片,视频
    目录利用python反转图片/视频安装库反转效果实现代码项目地址利用python反转图片/视频 准备:一张图片/一段视频 python库:Pillow,moviep...
    99+
    2024-04-02
  • 纯HTML5+CSS3如何制作图片旋转
    这篇文章给大家分享的是有关纯HTML5+CSS3如何制作图片旋转的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图如下:这个效果实现起来其实并不困难,代码清单如下:XML/HT...
    99+
    2024-04-02
  • 用python制作词云视频详解
    使用到的第三方库 Package Version --------------- --------- baidu-aip 2.2.18.0 jieba...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作