本文主要介绍了js实现预加载视频音频/视频获取截图(返回canvas截图)的相关资料,需要的朋友可以参考下,希望能帮助到大家。
#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) {
}
}
相关推荐:
javascript - 如何使用phantomjs获取截图并保存
以上就是js预加载视频音频/视频获取截图技巧分享的详细内容。