这是我的函数,用于确定html5视频元素缓冲区中的给定时间码(了解此here)。
我认为必须有更快的方法。也许在开始时间进行二元搜索?
我考虑了一个区间树,但考虑到系统级数据结构,维护该数据结构的成本似乎过高。
isTimecodeInBuffer = function( _tc ) {
var r = $(html5VideoEl).buffered;
var i;
var iMax = r.length;
var within = false;
//todo: better seek here
for (i=0; i<iMax; ++i) {
if (_tc >= r.start(i) && _tc < r.end(i)) {
within = true;
break;
}
}
return within;
};
答案 0 :(得分:1)
您可以使用稍微修改的标准二进制搜索来测试匹配时间范围,而不是精确匹配。不值得存储任何类型的数据结构,因为数据会随着额外数据的缓冲而频繁变化。
function bufferedGreater(haystack, index, value) {
return haystack.end(index) <= value;
}
function bufferedLess(haystack, index, value) {
return haystack.start(index) > value;
}
function binarySearch(haystack, needle, greaterThan, lessThan) {
var minIndex = 0,
maxIndex = haystack.length - 1,
currentIndex;
while (minIndex <= maxIndex) {
currentIndex = Math.floor((minIndex + maxIndex) / 2);
if (greaterThan(haystack, currentIndex, needle)) {
minIndex = currentIndex + 1;
} else if (lessThan(haystack, currentIndex, needle)) {
maxIndex = currentIndex - 1;
} else {
return currentIndex;
}
}
return -1;
}
var buffered = binarySearch(video.buffered, 10, bufferedGreater, bufferedLess) >= 0;
http://jsbin.com/vifedogi/1/edit?html,js,console,output
有一个工作演示注意:您需要直接访问视频元素上的buffered
对象,而不是jQuery对象,例如var r = html5VideoEl.buffered;