JS实现预加载视频音频/视频获取截图(返回canvas截图)


Posted in Javascript onOctober 09, 2017

 #load-media.js

/**
 * Create by Capricorncd 2017
 */
// 同域资源实现视频截图,可上传的图片数据格式
// 非同域资源实现canvas截图预览
// 提示码
const CODES = {
 0: 'success',
 1: 'The url is not valid',
 2: 'onerror'
}
/**
 * constructor
 * @param opts.url 音频|视频URL
 * @param opts.type 'audio|video'
 * @param opts.callback 回调函数
 */
function loadMedia(opts) {
 this.callback = opts.callback || function (res) {
  console.log(res);
 }
 // 初始化
 this.init(opts);
}
// prototype
loadMedia.prototype = {
 /**
  * 初始化media
  * @param url
  */
 init: function (opts) {
  let self = this;
  if (!opts.url || typeof opts.url !== 'string') {
   this.callback({code: 1, msg: CODES[1]});
   return;
  }
  // 创建media
  let mediaType = opts.type === 'audio' ? 'audio' : 'video';
  this.media = document.createElement(mediaType);
  console.log('this.media', this.media);
  // loaded
  this.listener('canplaythrough', function (e) {
   // 截图
   if (mediaType === 'video') {
    self.screenshot();
   } else {
    self.callback({
     code: 0,
     msg: CODES[0],
     thumb: null,
     media: this.media,
     canvas: null
    });
   }
  });
  // error
  this.listener('error', function (e) {
   self.callback({code: 2, msg: CODES[2], data: e});
  })
  this.media.setAttribute('src', opts.url);
 },
 screenshot: function () {
  // create canvas
  let canvas = document.createElement('canvas');
    canvas.width = this.media.videoWidth;
    canvas.height = this.media.videoHeight;
  let ctx = canvas.getContext('2d');
  // 截取
  ctx.drawImage(this.media, 0, 0);
  let thumb = null;
  // 非跨域资源
  // !!非同域资源无法获取数据
  try {
   let type = 'image/png';
   let data = canvas.toDataURL(type);
   thumb = this.toBlobData(data, type);
  } catch (e) {}
  this.callback({
   code: 0,
   msg: CODES[0],
   thumb: thumb,
   media: this.media,
   canvas: canvas
  })
 },
 // 数据转换
 toBlobData: function (data, type) {
  // 获取base64数据
  // base64数据格式:
  // "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAkGB+wgHBgkIBwgKCgkLDRYPDQw//9k="
  data = window.atob(data.split(',')[1]);
  let ia = new Uint8Array(data.length);
  for (let i = 0; i < data.length; i++) {
   ia[i] = data.charCodeAt(i);
  };
  // canvas.toDataURL 返回的默认格式是 image/png
  return new Blob([ia], {type: type});
 },
 /**
  * addEventListener 事件监听
  * @param en EventName
  * @param callback
  */
 listener: function (en, callback) {
  this.media.addEventListener(en, function (e) {
   if (callback) {
    callback(e);
   } else {
    console.warn(this);
   }
  }, false);
 }
 /**
  * 资源是否跨域
  * @param url 资源地址
  * @returns {boolean}
  */
 // isCrossDomain: function (url) {
 //  let loc, host, protocol;
 //  loc = window.location;
 //  host = loc.host;
 //  protocol = loc.protocol;
 //  // 是否为http链接
 //  if (/(http|https):\/\//.test(url)) {
 //   if (url.indexOf(protocol + '//' + host) >= 0) {
 //    return false;
 //   } else {
 //    return true;
 //   }
 //  }
 //  // './xxx.mp4' '/xxx.mp4' 'xxx.mp4'
 //  return false;
 // }
}

export default loadMedia;

// 参考资料
// HTML5的Video标签的属性,方法和事件汇总
// http://www.cnblogs.com/TF12138/p/4448108.html
# 使用
import loadMedia from '@/common/js/load-media'
let loadVideo = new loadMedia({
 type: 'video',
 url: 'http://xmqvip1-1253933147.file.myqcloud.com/chat/video/60/2017/09/29/qgj1c8K7oaYn-SCVideo-Merged.mp4',
 callback: handleCallback
})
function handleCallback (res) {
    console.log(res)
    // canplaythrough
    if (res.code === 0) {
    }
    // error
    if (res.code === 2) {
    }
   }

总结

以上所述是小编给大家介绍的JS实现预加载视频音频/视频获取截图(返回canvas截图),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 格式字符串的应用
Mar 29 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
Jan 10 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
用js写的一个路由(简单实例)
Sep 24 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
Mar 21 Javascript
jQuery 控制文本框自动缩小字体填充
Jun 16 jQuery
vue打包使用Nginx代理解决跨域问题
Aug 27 Javascript
jQuery表单校验插件validator使用方法详解
Feb 18 jQuery
vue实现户籍管理系统
May 29 Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 #Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
Oct 09 #Javascript
JS中Attr的用法详解
Oct 09 #Javascript
移动端效果之Swiper详解
Oct 09 #Javascript
浅谈node的事件机制
Oct 09 #Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 #Javascript
ES6中的Promise代码详解
Oct 09 #Javascript
You might like
PHP中路径问题的解决方案
2006/10/09 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
jQuery动态添加
2016/04/07 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
python:socket传输大文件示例
2017/01/18 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
房产买卖委托公证书
2014/04/04 职场文书
简单租房协议书
2014/04/09 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
Python数据类型最全知识总结
2021/05/31 Python
python获取对象信息的实例详解
2021/07/07 Python
5个实用的JavaScript新特性
2022/06/16 Javascript