这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~

制作方法:

1.在页面中加载视频

在使用canvas制作这个截图功能时,首先必须保证页面上已经加载完成了这个视频,这样才能够方便的对其操作。如果使用下面直接嵌入<video>标签的方式:

<video loop controls id="testmp4" width="500" height="400" >
<source src="test.mp4" type="video/mp4">
<source src="test.webm" type="video/webm">
<source src="test.ogg" type="video/ogg">
</video>

在我的那篇《html5与视频》中讲到,浏览器对视频的预加载progress以及load事件支持不同,会影响video的播放及其他事件的触发。所以我们在这里使用js构造video的方式来引入视频。

这种方式引入视频要注意,不能引入多个source,所以要先判断浏览器对视频格式的支持。

1.1使用video的canPlayType()方法判断支持格式

canPlayType()方法需要传入一个参数,这个参数就是video的格式,

常用值:video/ogg;

    video/mp4;

    video/webm;

或者包括编码器:

    video/ogg;codecs="theora,vorbis"

    video/mp4;codecs="avc1.4D401E, mp4a.40.2"

    video/webm;codesc="vp8.0, vorbis"

返回值:表示网页的支持级别:"probably"-最有可能支持(输入值带编码器的时候只返回这个);"maybe" - 可能支持;"" - (空字符串)不支持;

function videoType(video){
var returnType='';
if(video.canPlayType('video/mp4')=='probably'||video.canPlayType('video/mp4')=='maybe'){
  returnType= 'mp4';
}else if(video.canPlayType('video/ogg')=='probably'||video.canPlayType('video/ogg')=='maybe'){
    returnType= 'ogg';   
   }else if(video.canPlayType('video/webm')=='probably'||video.canPlayType('video/webm')=='maybe'){
    returnType= 'webm';   
   }
   return returnType;
}

这个函数可以判断浏览器对video支持的格式。

1.2使用js动态加载video标签

这里判断了浏览器的支持格式后,由于我用的是chrome,所以我的浏览器支持mp4格式的视频,然后我们动态创建一个video标签。

var videoElem;
var videoDiv;
function createVideo(){
videoElem=document.createElement("video");//创建video
videoDiv=document.getElementById("videopanel");//获取video的外层容器
videoDiv.appendChild(videoElem);
var vtype=videoType(videoElem);//判断浏览器支持的格式
if(vtype==""){
videoDiv.innerHtml('不支持video')
}else{
videoElem.setAttribute('src',"text."+vtype);
} }

由于这里我们要制作截图功能,单纯的video不具备截图的接口,所以我们要把它复制到canvas上,在canvas上播出这个视频,所以这里我们先把video给隐藏掉(display:none)。

2.使用canvas复制视频

现在video已经在浏览器上播放了,接下来我们把它复制到canvas里,首先建立canvas,然后得到画布context,这些就不说了。如何把video画在canvas上,这里我们要使用一个函数。drawImage函数的用法

1.drawImage(img,x,y):在画布的(x,y)这个位置画一个img;

2.drawImage(img,x,y,width,height):在画布的(x,y)这个位置画一个width宽,height高的img;

3.drawImage(img,sx,sy,swidth,sheight,x,y,width,height):在画布的(x,y)位置画一个img的(sx,sy)位置的swidth宽,sheight高的一块截图,画在画布上要缩放到width宽和height高。

以上就是drawImage的用法了,这个函数非常的强大。

回到做截图,我们现在已经在浏览器上创建好了画布--contextVideo,接着我们在这里把视频画出来:

contextVideo.drawImage(videoElem,0,0);

然后我们可以看到在canvas里画了一张图,但是视频是不断变化的,所以我们需要使用setInterval函数不断的吧video作为源来画图。

setInterval(function(){
contextVideo,drawImage(videoElem,0,0);
},100)

这里时间间隔的大小会影响到视频播放是否会卡。  

到这里我们就把video搬到canvas上展示了。接下来制作截图。

3.制作截图展示canvas面板

这里我们需要再在页面上画一个canvas画布--contextImg,然后再次利用drawImage方法,截图。

contextImg.drawImage(canvasVideo,0,0,canvasVideo.width,canvasVideo.height);

这段代码将第一个canvas画到了第二个canvas上。

4.制作截图按钮

制作一个按钮,然后绑定click事件,点击后就调用上一步的函数,这样就可以制作一个截图了。

当图截好后可以将图右键保存下来,然后倒入ps制作表情包了。

5.demo及一些表情包。

视频截图:Demo;(打开之前请调小音量,点击坐上click即可截图)

表情包:

内容原创,转载请注明出处:

作者:Jess_喵

来源:http://www.cnblogs.com/zhangwenjiajessy/p/6158131.html

 

canvas与html5实现视频截图功能的更多相关文章

  1. 【转载】用原生JS和html5进行视频截图并保存到本地

    支持并尊重原创!原文地址:http://www.cnblogs.com/xieshuxin/p/6731637.html <!doctype html> <html> < ...

  2. 用原生JS和html5进行视频截图并保存到本地

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. HTML5 CSS3 诱人的实例 :模仿优酷视频截图功能

    一般的视频网站对于用户上传的视频,在用户上传完成后,可以对播放的视频进行截图,然后作为视频的展示图.项目中也可以引入这样的功能给用户一种不错的体验,而不是让用户额外上传一张展示图. 效果图: 看起来还 ...

  4. .net视频截图功能,没测试

    /// <summary> /// @从视频文件截图,生成在视频文件所在文件夹 /// 在Web.Config 中需要两个前置配置项: /// 1.ffmpeg.exe文件的路径 ///  ...

  5. 通过jcrop和canvas的画布功能完成对图片的截图功能与视频的截图功能实现

    最近因为工作需要,做了视频截图和图截图的功能.大概需求是,用户点击某个按钮,可以对图片区域进行部分截取,然后进行进一步的业务操作. 首先说图片截图功能的思路, (1)下载Jcrop插件,添加css和j ...

  6. 阿里云Aliplayer高级功能介绍(一):视频截图

    基本介绍 H5 Video是不提供截图的API的, 视频截图需要借助Canvas,通过Canvas提供的drawImage方法,把Video的当前画面渲染到画布上, 最终通过toDataURL方法可以 ...

  7. 利用HTML5的Video进行视频截图并保存到本地

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 【javascript】html5中使用canvas编写头像上传截取功能

    [javascript]html5中使用canvas编写头像上传截取功能 本人对canvas很是喜欢,于是想仿照新浪微博头像上传功能(前端使用canvas) 本程序目前在谷歌浏览器和火狐浏览器测试可用 ...

  9. java-FFmpeg(一) 实现视频的转码和截图功能

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

随机推荐

  1. 几个有趣的WEB设备API(二)

    浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...

  2. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞

    第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...

  3. 虚拟dom与diff算法 分析

    好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM

  4. spark处理大规模语料库统计词汇

    最近迷上了spark,写一个专门处理语料库生成词库的项目拿来练练手, github地址:https://github.com/LiuRoy/spark_splitter.代码实现参考wordmaker ...

  5. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  6. bootstrap-fileinput 简单使用

    bootstrap-fileinput 是一款图片/文件上传 bootstrap 插件,简单示例代码: <!DOCTYPE html> <html> <head> ...

  7. [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform

    eclipse maven clean install 报错 1. 修改properties-->resource-->utf-8仍然报错 2.修改项目pom.xml文件,增加: < ...

  8. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  9. VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答

    用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...

  10. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...