JS實(shí)現(xiàn)預(yù)加載視頻音頻/視頻獲取截圖(返回canvas截圖)
#load-media.js
/**
* Create by Capricorncd 2017
*/
// 同域資源實(shí)現(xiàn)視頻截圖,可上傳的圖片數(shù)據(jù)格式
// 非同域資源實(shí)現(xiàn)canvas截圖預(yù)覽
// 提示碼
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 回調(diào)函數(shù)
*/
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;
}
// 創(chuàng)建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;
// 非跨域資源
// !!非同域資源無(wú)法獲取數(shù)據(jù)
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
})
},
// 數(shù)據(jù)轉(zhuǎn)換
toBlobData: function (data, type) {
// 獲取base64數(shù)據(jù)
// base64數(shù)據(jù)格式:
// "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 返回的默認(rèn)格式是 image/png
return new Blob([ia], {type: type});
},
/**
* addEventListener 事件監(jiān)聽
* @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標(biāo)簽的屬性,方法和事件匯總
// 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) {
}
}
總結(jié)
以上所述是小編給大家介紹的JS實(shí)現(xiàn)預(yù)加載視頻音頻/視頻獲取截圖(返回canvas截圖),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JS 頁(yè)面自動(dòng)加載函數(shù)(兼容多瀏覽器)
兼容多個(gè)瀏覽器的自動(dòng)加載函數(shù)。2009-05-05
微信小程序?qū)崿F(xiàn)左側(cè)滑欄過(guò)程解析
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)左側(cè)滑欄過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
微信小程序圖片自適應(yīng)實(shí)現(xiàn)解析
這篇文章主要介紹了微信小程序圖片自適應(yīng)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Javascript設(shè)計(jì)模式之發(fā)布訂閱模式
發(fā)布---訂閱模式又叫觀察者模式,它定義了對(duì)象間的一種一對(duì)多的關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知2022-12-12
通過(guò)實(shí)例解析JavaScript常用排序算法
這篇文章主要介紹了通過(guò)實(shí)例解析JavaScript常用排序算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

