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 相关文章推荐
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
jQuery为动态生成的select元素添加事件的方法
Aug 29 Javascript
jQuery zTree树插件简单使用教程
Jan 10 Javascript
微信小程序  checkbox组件详解及简单实例
Jan 10 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
Sep 20 jQuery
es6 filter() 数组过滤方法总结
Apr 03 Javascript
JavaScript实现英语单词题库
Dec 24 Javascript
微信小程序实现日历小功能
Nov 18 Javascript
Vue使用鼠标在Canvas上绘制矩形
Dec 24 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
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
详解angular element()方法使用
2017/04/08 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
浅析Git版本控制器使用
2017/12/10 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
初一科学教学反思
2014/01/27 职场文书
运动会通讯稿200字
2014/02/16 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
垃圾桶标语
2014/06/24 职场文书
服务行业演讲稿
2014/09/02 职场文书
大学生逃课检讨书
2015/05/04 职场文书
行政处罚告知书
2015/07/01 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android