hjplayer
Version:
hjplayer, a HTML5 Player, can play flv and hls by Media Source Extension, based on typescript;
137 lines (119 loc) • 3.7 kB
text/typescript
/*
* Copyright (C) 2016 Bilibili. All Rights Reserved.
*
* @author zheng qian <xqq@xqq.im>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Utility class to calculate realtime network I/O speed
import getGlobal from '../Utils/getGlobalObject';
const GlobalEnvironment = getGlobal();
class SpeedChecker {
/**
* 首次检测时间
*/
_firstCheckpoint: number
/**
* 最新检测时间
*/
_lastCheckpoint: number
/**
* 单次下载量
*/
_intervalBytes: number
/**
* 总字节数
*/
_totalBytes: number
/**
* 最新下载速度
*/
_lastSecondBytes: number
/**
* 获取现在时间 performace.now || Date.now
*/
_now: () => number
constructor() {
// milliseconds
this._firstCheckpoint = 0;
this._lastCheckpoint = 0;
this._intervalBytes = 0;
this._totalBytes = 0;
this._lastSecondBytes = 0;
// compatibility detection
if(GlobalEnvironment.performance && GlobalEnvironment.performance.now) {
this._now = GlobalEnvironment.performance.now.bind(GlobalEnvironment.performance);
} else {
this._now = Date.now;
}
}
reset(): void {
this._lastCheckpoint = 0;
this._firstCheckpoint = 0;
this._intervalBytes = 0;
this._totalBytes = 0;
this._lastSecondBytes = 0;
}
/**
* 添加下载数据
* @param bytes 下载数据大小
*/
addBytes(bytes: number): void {
if(this._firstCheckpoint === 0) {
this._firstCheckpoint = this._now();
this._lastCheckpoint = this._firstCheckpoint;
this._intervalBytes += bytes;
this._totalBytes += bytes;
} else if(this._now() - this._lastCheckpoint < 1000) {
this._intervalBytes += bytes;
this._totalBytes += bytes;
} else {
// duration >= 1000
this._lastSecondBytes = this._intervalBytes;
this._intervalBytes = bytes;
this._totalBytes += bytes;
this._lastCheckpoint = this._now();
}
}
/**
* 当前下载速度
*/
get currentKBps(): number {
this.addBytes(0);
let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;
if(durationSeconds === 0) durationSeconds = 1;
return this._intervalBytes / durationSeconds / 1024;
}
get lastSecondKBps(): number {
this.addBytes(0);
if(this._lastSecondBytes !== 0) {
return this._lastSecondBytes / 1024;
}
// lastSecondBytes === 0
if(this._now() - this._lastCheckpoint >= 500) {
// if time interval since last checkpoint has exceeded 500ms
// the speed is nearly accurate
return this.currentKBps;
}
// We don't know
return 0;
}
/**
* 平均下载速度
*/
get averageKBps(): number {
const durationSeconds = (this._now() - this._firstCheckpoint) / 1000;
return this._totalBytes / durationSeconds / 1024;
}
}
export default SpeedChecker;