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 封装Ajax传递的数据代码
Jun 05 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
Apr 23 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
JavaScript中var关键字的使用详解
Aug 14 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
vue中组件通信的八种方式(值得收藏!)
Aug 09 Javascript
vue抽出组件并传值实例
Jul 31 Javascript
JavaScript实现多层颜色选项卡嵌套
Sep 21 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP CURL 多线程操作代码实例
2015/05/13 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
python的Tqdm模块的使用
2018/01/10 Python
Python操作json的方法实例分析
2018/12/06 Python
python实现随机漫步方法和原理
2019/06/10 Python
django迁移数据库错误问题解决
2019/07/29 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
python 两种方法删除空文件夹
2020/09/29 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
园林技术个人的自我评价
2014/01/08 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
气象学专业个人求职信
2014/03/15 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
女性健康讲座主持词
2015/07/04 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
python使用torch随机初始化参数
2022/03/22 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS