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的transition属性详解
Dec 15 HTML / CSS
基于CSS3实现图片模糊过滤效果
Nov 19 HTML / CSS
CSS3 text-shadow实现文字阴影效果
Feb 24 HTML / CSS
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
Mar 02 HTML / CSS
利用css3如何设置没有上下边的列表间隔线
Jul 03 HTML / CSS
HTML5-WebSocket实现聊天室示例
Dec 15 HTML / CSS
详解Html5原生拖拽操作
Jan 12 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
Jul 19 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
Aug 18 HTML / CSS
canvas进阶之如何画出平滑的曲线
Oct 15 HTML / CSS
利用Node实现HTML5离线存储的方法
Oct 16 HTML / CSS
CSS3实现的侧滑菜单
Apr 27 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
Knockoutjs的环境搭建教程
2012/11/26 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
js实现二级导航功能
2017/03/03 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
深入理解Python3中的http.client模块
2017/03/29 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
python的中异常处理机制
2018/08/30 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
python接入支付宝的实例操作
2020/07/20 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
学生拾金不昧表扬信
2014/01/21 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书