优化在html5视频缓冲区中搜索时间码值?

时间:2014-03-31 01:33:15

标签: javascript html5 search html5-video binary-search

这是我的函数,用于确定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;
};

1 个答案:

答案 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;