NetStream: буферизация с двойным порогом и поиск за пределами буфера

Эта была полезной статьей о буферизации с двойным порогом. В нем объясняется, что вы можете прослушивать события NetStream.Buffer.Full и NetStream.Buffer.Empty на NetStream и соответственно регулировать время буферизации NetStream, чтобы максимально использовать доступную полосу пропускания, а также получить быстрое время запуска видео. Однако я столкнулся с проблемой. Когда я просматриваю буферный раздел видео в моем NetStream, буфер снова становится пустым, но я не получаю событие NetStream.Buffer.Empty. Время буферизации NetStream по-прежнему установлено на мое расширенное время буферизации, поэтому я теряю преимущество быстрого времени запуска. Как вы реализуете эту стратегию, чтобы она работала правильно в данном случае? Как узнать, что буфер снова пуст или что вы перешли за пределы доступного буфера?

Изменить: я, вероятно, должен упомянуть, что использую поиск в буфере (Smart Seeking). Я думаю, это не было бы проблемой, если бы я не был, потому что флэш-память очищает буфер при каждом поиске без включения этой функции.


person Rob Allsopp    schedule 11.01.2015    source источник
comment
Эта статья очень полезна для буферизации длинных потоков, да, но я думаю, что вы можете использовать здесь часть логики. Низкий порог буфера при пустом буфере при поиске должен способствовать продолжению воспроизведения. Однако Seek немного меняет ситуацию. Я должен спросить, действительно ли ищут то, что нужно клиенту? Если это действие для поиска, инициированное пользователем, то от них не требуется слишком много буферизации воспроизведения. Это должно быть приемлемым для пользователя интерфейсом. Если они хотят искать, они должны быть готовы подождать, пока их контент не будет готов.   -  person tree    schedule 12.01.2015


Ответы (1)


Решением для меня было просто сбрасывать время буфера при каждом поиске. Вы по-прежнему получите событие NetStream.Buffer.Full, и оно сработает немедленно, если вам случится искать место, где буфер уже превышает ваш минимальный буфер, поэтому ваш обработчик для NetStream.Buffer.Full просто немедленно установит время буфера обратно в ваш расширенный буфер время. Вот пример:

var videoStream:NetStream = new NetStream(nc);

videoStream.addEventListener(NetStatusEvent.NET_STATUS, function (event:NetStatusEvent):void {
    switch(event.info.code) {
        case "NetStream.Buffer.Full":
            // this will keep the buffer filling continuously while there is bandwidth
            videoStream.bufferTime = Settings.maxBuffer;
            State.buffering = false;
            break;
        case "NetStream.Buffer.Empty":
            // if we run out of buffer we'll reset the buffer time to the min
            videoStream.bufferTime = Settings.minBuffer;
            State.buffering = true;
            break;
    }
}

_view.addEventListener(SeekEvent.SEEK, function (event:SeekEvent):void {
    State.buffering = true;
    videoStream.bufferTime = Settings.minBuffer;
    videoStream.seek(event.seek * (_duration || 0));
});
person Rob Allsopp    schedule 13.01.2015