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实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
Dec 17 Javascript
jQuery让控件左右移动的三种实现方法
Sep 08 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
vue-cli webpack2项目打包优化分享
Feb 07 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
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 购物车的例子
2009/05/04 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php cookie 详解使用实例
2016/11/03 PHP
php中final关键字用法分析
2016/12/07 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
java必学必会之static关键字
2015/12/03 Javascript
javascript history对象详解
2017/02/09 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python匿名函数的使用方法解析
2019/10/10 Python
python常用排序算法的实现代码
2019/11/08 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
餐饮管理自我介绍信
2014/01/15 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
创新型城市实施方案
2014/03/06 职场文书
小组组名及励志口号
2015/12/24 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
Python jiaba库的使用详解
2021/11/23 Python