Canvas获取视频第一帧缩略图的实现


Posted in HTML / CSS onNovember 11, 2020

记录下一个疑问,最近在重新看canvas做点Demo这样,时间是写在2019年11月5日,以后要是没有这个问题了,以W3C更新的为标准,这个只是参考 尝试着在canvas中显示视频第一帧的时候碰上的问题:在Chrome中,用 video.addEventLisener("loadeddata",func)、 video.onloadeddata = func无法在函数中获取到 未预加载的视频的第一帧的图片。同样的代码在Firefox中 未预加载的视频可以获取到第一帧,并且能够渲染到canvas中。以下都是不进行预加载的情况下运行的。

要是不能运行了就在评论里说下,我是从写的一个Demo里截下来一部分的=。=

HTML代码片段

<div class="canvas-class">
 <canvas id="canvasImgDemo"></canvas>
</div>
<div class="img-source">
 <div class="video-div">
  <video id="videoSource" 
   controls="controls" 
   poster 
   src="../../resources/1.mp4" 
   onloadeddata="videoGetFirstFrame(this)
  ></video>
 </div>
</div>

Chrome能显示方法

在标签中添加事件处理,这时候可以得到第一帧的图片数据。

var imgs = [];
 var videoGetFirstFrame = (elem) => {
  var canvas = document.createElement("canvas"),
   img = new Image();
  canvas.getContext("2d").drawImage(elem, 0, 0);

  let dataURL = canvas.toDataURL("image/png");
  img.onload = (e) => {
   var target = document.getElementById("canvasImgDemo"),
    ctx = target.getContext("2d");
   ctx.drawImage(img, 0, 0, target.width, target.height);
  };
  imgs.push(dataURL);
 };

Firefox下可以运行的

以下两种方法在Chrome下没法显示图片,但是在Firefox下也可以显示。在Chrome控制台你可以看见拿到的dataURL其实是一个全透明的矩形。不过在预加载、加载过或者缓存过一次视频后,canvas就有了。

方法一

JS代码片段

let elem = document.getElementById("canvasImgDemo"),
 ctx = elem.getContext(module.CONTEXT_TYPE),
 targetElem = document.getElementById(target),
 tagName = targetElem.tagName;
 
ctx.drawImage(targetElem, 0, 0);
var imgData = elem.toDataURL("image/png"),
img = new Image();
img.onload = () => {
 ctx.drawImage(img, 0, 0, elem.width, elem.height);
}
img.src = imgData;

方法二

其实跟方法一类似,不过思路是用document创建的HTMLVideoElement作一次中转之后来触发这个loadeddata事件的发生,算是上面方法在video的应用。

let video = document.createElement("video");
video.addEventListener("loadeddata", (evt) => {
 ctx.drawImage(evt.target, 0, 0);
 let dataURL = elem.toDataURL("image/png");
 let img = new Image();
 img.onload = () => {
  ctx.drawImage(img, 0, 0, 300, 150);
 };
 img.src = dataURL;
});
video.src = targetImg.src;
ctx.drawImage(targetImg, 0, 0);

到此这篇关于Canvas获取视频第一帧缩略图的实现的文章就介绍到这了,更多相关Canvas视频缩略图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
纯CSS3实现表单验证效果(非常不错)
Jan 18 HTML / CSS
实现CSS3中的border-radius(边框圆角)示例代码
Jul 19 HTML / CSS
CSS改变网页中鼠标选中文字背景颜色例子
Apr 23 HTML / CSS
CSS3弹性盒模型flex box快速入门心得(必看篇)
May 24 HTML / CSS
浅谈CSS3中display属性的Flex布局的方法
Aug 14 HTML / CSS
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
Aug 15 HTML / CSS
HTML5里autofocus自动聚焦属性使用介绍
Jun 22 HTML / CSS
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
Dec 13 HTML / CSS
html5构建触屏网站之touch事件介绍
Jan 07 HTML / CSS
html5的websockets全双工通信详解学习示例
Feb 26 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
Jun 23 HTML / CSS
css3实现背景图片颜色修改的多种方式
Apr 13 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
Nov 10 #HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
Nov 10 #HTML / CSS
萌新HTML5 入门指南(二)
Nov 09 #HTML / CSS
萌新的HTML5 入门指南
Nov 06 #HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
Nov 04 #HTML / CSS
浅析HTML5 meta viewport参数
Oct 28 #HTML / CSS
一个基于canvas的移动端图片编辑器的实现
Oct 28 #HTML / CSS
You might like
怎样在php中使用PDF文档功能
2006/10/09 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
PHP5.3新特性小结
2016/02/14 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
踏青活动策划方案
2014/08/19 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
nginx配置之并发频次限制
2022/04/18 Servers