var isMobile = {
|
Android: function() {
|
return navigator.userAgent.match(/Android/i);
|
},
|
iOS: function() {
|
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
},
|
safari: function() {
|
return navigator.userAgent.toLowerCase().indexOf('safari/') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome/') === -1;
|
},
|
PC: function() {
|
|
}
|
};
|
|
var isWebRTCSupported = false;
|
['RTCPeerConnection', 'webkitRTCPeerConnection', 'mozRTCPeerConnection', 'RTCIceGatherer'].forEach(function(item) {
|
if (isWebRTCSupported) {
|
return;
|
}
|
if (item in window) {
|
isWebRTCSupported = true;
|
}
|
});
|
|
function startBrowserTest() {
|
|
var sys = getSystemInfo();
|
if (sys.browserName == 'IE' || sys.browserName == 'Firefox') {
|
// IE和Firefox不支持
|
return false;
|
} else if (sys.browserName == 'Chrome' && parseInt(sys.browserVersion) < 56) {
|
// Chrome 56+
|
return false;
|
} else if (sys.browserName == 'Safari' && parseInt(sys.browserVersion) < 11) {
|
// Safari 11+
|
return false;
|
} else if(navigator.userAgent.indexOf('baiduappbox') > -1){
|
// 百度APP
|
return false;
|
}
|
|
var isSupport = true;
|
var isMobileBrowser = false;
|
for (var a in isMobile) {
|
if (isMobile[a]()) {
|
isMobileBrowser = true
|
var version = checkTBSVersion(navigator.userAgent);
|
if (a === 'Android' && version && version < 43600) {
|
isSupport = false;
|
} else if (!isWebRTCSupported || (!isMobile.safari() && isMobile.iOS())) {
|
isSupport = false;
|
} else {
|
if (isMobile.safari() && isMobile.iOS()) {
|
//ios 11 版本 11.0.3 以下不支持
|
var matches = (navigator.userAgent).match(/OS (\d+)_(\d+)_?(\d+)?/);
|
if (matches && matches[1] >= 11 && (matches[2] >= 1 || matches[3] >= 3)) {
|
isSupport = true;
|
} else {
|
isSupport = false;
|
}
|
} else {
|
isSupport = true;
|
}
|
}
|
break;
|
}
|
}
|
if (isWebRTCSupported) {
|
checkH264Support(function(encode, decode) {
|
isSupport = false;
|
if (!encode || !decode) {
|
isWebRTCSupported = false;
|
}
|
if (!isMobileBrowser) {
|
if (isWebRTCSupported) {
|
isSupport = true;
|
}
|
}
|
});
|
}
|
|
return isSupport;
|
}
|
|
function checkTBSVersion(ua) {
|
var list = ua.split(" ");
|
for (var i = 0; i < list.length; i++) {
|
var item = list[i];
|
if (item.indexOf("TBS") !== -1 || item.indexOf("tbs") !== -1) {
|
var versionStr = item.split("/")[1];
|
var version = parseInt(versionStr) || 0;
|
return version
|
}
|
}
|
return null;
|
}
|
|
function checkH264Support(callback) {
|
try {
|
var peer = new RTCPeerConnection(null);
|
var decode = checkH264DecodeSupport()
|
peer.createOffer({
|
offerToReceiveAudio: 1,
|
offerToReceiveVideo: 1
|
}).then(function(data) {
|
var encode = data.sdp.toLowerCase().indexOf("h264") !== -1
|
callback(encode, decode)
|
peer.close();
|
}, function(data) {
|
callback(false, decode)
|
});
|
} catch (err) {
|
callback(false, false);
|
}
|
}
|
|
function checkH264DecodeSupport() {
|
var element = document.createElement('video')
|
return !!element.canPlayType && (canPlayType(element, 'video/mp4; codecs="avc1.42E01E"') || canPlayType(element,
|
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'))
|
}
|
var canPlayType = function(element, type) {
|
return element.canPlayType(type) == 'probably';
|
};
|
|
function getSystemInfo() {
|
var agent = navigator.userAgent;
|
var browserName = navigator.appName;
|
var version = '' + parseFloat(navigator.appVersion);
|
var offsetName;
|
var offsetVersion;
|
var ix;
|
|
if ((offsetVersion = agent.indexOf('Chrome')) !== -1) {
|
browserName = 'Chrome';
|
version = agent.substring(offsetVersion + 7);
|
} else if ((offsetVersion = agent.indexOf('MSIE')) !== -1) {
|
browserName = 'IE'; // Older IE versions.
|
version = agent.substring(offsetVersion + 5);
|
} else if ((offsetVersion = agent.indexOf('Trident')) !== -1) {
|
browserName = 'IE'; // Newer IE versions.
|
version = agent.substring(offsetVersion + 8);
|
} else if ((offsetVersion = agent.indexOf('Firefox')) !== -1) {
|
browserName = 'Firefox';
|
} else if ((offsetVersion = agent.indexOf('Safari')) !== -1) {
|
browserName = 'Safari';
|
version = agent.substring(offsetVersion + 7);
|
if ((offsetVersion = agent.indexOf('Version')) !== -1) {
|
version = agent.substring(offsetVersion + 8);
|
}
|
} else if ((offsetName = agent.lastIndexOf(' ') + 1) <
|
(offsetVersion = agent.lastIndexOf('/'))) {
|
browserName = agent.substring(offsetName, offsetVersion);
|
version = agent.substring(offsetVersion + 1);
|
if (browserName.toLowerCase() === browserName.toUpperCase()) {
|
browserName = navigator.appName;
|
}
|
}
|
if ((ix = version.indexOf(';')) !== -1) {
|
version = version.substring(0, ix);
|
}
|
if ((ix = version.indexOf(' ')) !== -1) {
|
version = version.substring(0, ix);
|
}
|
return {
|
'browserName': browserName,
|
'browserVersion': version,
|
'platform': navigator.platform
|
};
|
}
|
//使用requestAnimationFrame重写setInterval,进行性能优化
|
function setAnimationFrame(render) {
|
// 计时器ID
|
let timer = {};
|
|
function animeLoop() {
|
render();
|
timer.id = requestAnimationFrame(animeLoop);
|
}
|
animeLoop();
|
return timer;
|
}
|
|
// 清除AnimationFrame
|
function clearAnimationFrame(timer) {
|
cancelAnimationFrame(timer.id);
|
}
|