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 相关文章推荐
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
Jquery AutoComplete自动完成 的使用方法实例
Mar 19 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
Sep 20 Javascript
使用Node.js为其他程序编写扩展的基本方法
Jun 23 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
Oct 09 Javascript
JS中的二叉树遍历详解
Mar 18 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
js实现音乐播放控制条
Sep 09 Javascript
微信小程序实时聊天WebSocket
Jul 05 Javascript
解决iView Table组件宽度只变大不变小的问题
Nov 13 Javascript
VUE项目实现主题切换的多种方法
Nov 26 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
JavaScript的继承的封装介绍
2013/10/15 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
深入了解Django中间件及其方法
2019/07/26 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
Python如何读写二进制数组数据
2020/08/01 Python
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
校园报刊亭创业计划书
2014/01/02 职场文书
房地产还款计划书
2014/01/10 职场文书
化学教学随笔感言
2014/02/19 职场文书
关于安全的广播稿
2014/10/23 职场文书
企业宣传稿范文
2015/07/23 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
MySQL锁机制
2021/04/05 MySQL
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
解析目标检测之IoU
2021/06/26 Python