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 相关文章推荐
10 套华丽的CSS3 按钮小结
Oct 03 HTML / CSS
利用纯CSS3实现tab选项卡切换示例代码
Sep 21 HTML / CSS
css3 实现圆形旋转倒计时
Feb 24 HTML / CSS
CSS3中引入多种自定义字体font-face
Jun 12 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
Apr 24 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
Sep 21 HTML / CSS
h5实现获取用户地理定位的实例代码
Jul 17 HTML / CSS
Html5页面内使用JSON动画的实现
Jan 29 HTML / CSS
h5移动端调用支付宝、微信支付的实现
Jun 08 HTML / CSS
AmazeUI 输入框组的示例代码
Aug 14 HTML / CSS
amazeui页面校验功能的实现代码
Aug 24 HTML / CSS
css animation配合SVG制作能量流动效果
Mar 24 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下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
python实现比较文件内容异同
2018/06/22 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python set内置函数的具体使用
2019/07/02 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
python如何停止递归
2020/09/09 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
小学生竞选班长演讲稿
2014/04/24 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2014年营销工作总结
2014/11/22 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL