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 图片预览效果 推荐
Dec 22 Javascript
js 未结束的字符串常量错误解决方法
Jun 13 Javascript
js Array对象的扩展函数代码
Apr 24 Javascript
基于原生js淡入淡出函数封装(兼容IE)
Oct 20 Javascript
react-native-tab-navigator组件的基本使用示例代码
Sep 07 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
微信小程序自定义单项选择器样式
Jul 25 Javascript
微信公众号生成新浪短网址的实现(快速生成)
Aug 18 Javascript
vue实现评论列表功能
Oct 25 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 Javascript
vue项目中使用多选框的实例代码
Jul 22 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下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
Python实现单词拼写检查
2015/04/25 Python
浅谈flask源码之请求过程
2018/07/26 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
linux面试题参考答案(7)
2014/07/24 面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
医学生个人求职信范文
2013/09/24 职场文书
群众路线对照检查材料
2014/09/22 职场文书
解除租房协议书
2014/12/03 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书