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画一个阴阳八卦图
Mar 09 HTML / CSS
CSS3实现跳动的动画效果
Sep 12 HTML / CSS
手把手教你用纯css3实现轮播图效果实例
May 04 HTML / CSS
css3中transition属性详解
Sep 02 HTML / CSS
css3+伪元素实现鼠标移入时下划线向两边展开的效果
Apr 25 HTML / CSS
利用css3如何设置没有上下边的列表间隔线
Jul 03 HTML / CSS
Javascript 高级手势使用介绍
Apr 21 HTML / CSS
【HTML5】3D模型--百行代码实现旋转立体魔方实例
Dec 16 HTML / CSS
浅谈Html5多线程开发之WebWorkers
May 02 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
Aug 16 HTML / CSS
video.js支持m3u8格式直播的实现示例
May 20 HTML / CSS
使用CSS连接数据库的方式
Feb 28 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
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
php获取随机数组列表的方法
2014/11/13 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
破解Session cookie的方法
2006/07/28 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
document.getElementById介绍
2011/09/13 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python基础入门之seed()方法的使用
2015/05/15 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
高一历史教学反思
2014/01/13 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
人事任命通知
2015/04/20 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
公司管理制度范本
2015/08/03 职场文书
导游词之广西漓江
2019/11/02 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android