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下数值型比较难点说明
Jun 07 Javascript
JS弹出窗口代码大全(详细整理)
Dec 21 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
Dec 04 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
AngularJS实现动态编译添加到dom中的方法
Nov 04 Javascript
JavaScript 动态三角函数实例详解
Jan 08 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
vue动态注册组件实例代码详解
May 30 Javascript
小程序接口的promise化的实现方法
Dec 11 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
python基础知识小结之集合
2015/11/25 Python
深入源码解析Python中的对象与类型
2015/12/11 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
python的文件操作方法汇总
2017/11/10 Python
有关Python的22个编程技巧
2018/08/29 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
python实现双色球随机选号
2020/01/01 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
工程采购员岗位职责
2014/03/09 职场文书
卖车协议书
2014/04/21 职场文书
设计师求职信模板
2014/05/06 职场文书
教师工作总结范文2014
2014/11/10 职场文书
教师业务学习材料
2014/12/16 职场文书
2015年社区服务活动总结
2015/03/25 职场文书