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弹性盒模型开发笔记(一)
Apr 26 HTML / CSS
CSS3教程:边框属性border的极致应用
Apr 02 HTML / CSS
CSS3 选择器 基本选择器介绍
Jan 21 HTML / CSS
css图标制作教程制作云图标
Jan 19 HTML / CSS
CSS实现定位元素居中的方法
Jun 23 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
Jan 15 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
Mar 14 HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
Jan 31 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
Jul 04 HTML / CSS
Amaze UI 文件选择域的示例代码
Aug 26 HTML / CSS
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
Aug 23 HTML / CSS
浅谈css清除浮动(clearfix和clear)的用法
May 21 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
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
详解python itertools功能
2020/02/07 Python
pytorch数据预处理错误的解决
2020/02/20 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
美国零售商店:Blue&Cream
2017/04/07 全球购物
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
int和Integer有什么区别
2013/05/25 面试题
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
工程测量与监理专业应届生求职信
2013/11/27 职场文书
白酒市场开发计划书
2014/01/09 职场文书
初中英语教学反思
2014/01/25 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python