Как определить, когда видео буферизируется?
Мой вопрос сегодня касается буферизации видео Flash AS3. (Потоковое или прогрессивное) Я хочу иметь возможность определять, когда видео буферизуется, поэтому я могу отображать какую-то анимацию, позволяющую пользователю знать, что нужно подождать немного дольше.
В настоящее время мое видео запустится, удерживайте кадр 1 в течение 3-4 секунд, затем воспроизведите. Вроде как создается впечатление, что видео приостановлено или сломано:(
Обновить
Благодаря iandisme, я считаю, что теперь я в правильном направлении. NetStatusEvent от liveocs. Мне кажется, что ключевым статусом для работы является "NetStream.Buffer.Empty"
поэтому я добавил туда немного кода, чтобы посмотреть, вызовет ли это мою анимацию или оператор трассировки. Пока не повезло, однако, когда буфер заполнен, он вызовет мой код: / Может быть, мое видео всегда где-то между Buffer.Empty
а также Buffer.Full
Вот почему он не будет запускать код, когда я тестирую Buffer.Empty
?
Текущий код
public function netStatusHandler(event:NetStatusEvent):void
{
// handles net status events
switch (event.info.code)
{
case "NetStream.Buffer.Empty":
trace("☼☼☼ Buffering!"); //<- never traces
addChild(bufferLoop); //<- doesn't execute
break;
case "NetStream.Buffer.Full":
trace("☼☼☼ FULL!"); //<- trace works here
removeChild(bufferLoop); //<- so does any other code
break;
case "NetStream.Buffer.Flush":
trace("☼☼☼ FLUSH!");
//Not sure if this is important
break
}
}
3 ответа
Вы используете кастомный плеер? Я знаю, что класс FLVPlayback имеет встроенное событие буферизации.
Если вы не используете FLVPlayback, объект NetStream запускает netStatusEvent, который включает информационный объект каждый раз, когда он запускает или останавливает буферизацию. Вы должны быть в состоянии захватить это событие и воспроизвести / скрыть свою анимацию с этим.
Вы можете попробовать проверять параметры буферов NetStream и bufferLength каждые 100 миллисекунд и принимать решения на основе этого. Параметр bufferTime в NetStream сообщает, как долго он должен буферизоваться перед воспроизведением, а bufferLength сообщает, сколько времени он уже находится в буфере.
function onTimerEvent(e:TimerEvent):void {
var percent:Number = Math.round(ns.bufferLength/ns.bufferTime100 * 100);
if (percent >= 95 && contains(bufferLoop)) {
removeChild(bufferLoop);
}
if (percent < 25 && !contains(bufferLoop)) {
addChild(bufferLoop);
}
}
Я сталкивался с этим и думал, что поделюсь. Леон выше упоминает, что NetStream.Buffer.Empty ничего не отслеживает. Это потому, что вы загружаете свой FLV с локального компьютера, поэтому буфер никогда не будет пустым. Это работает, когда вы действительно транслируете онлайн.
Все, что я сделал, это установил нужный клип в качестве "буфера ожидания", видимого, когда фильм начал воспроизводиться, затем использовал этот код, чтобы он исчез и вернулся. Работал как шарм.
var vidplaying:Boolean = false;
playmovie_btn.addEventListener(MouseEvent.CLICK, playmovie);
function playmovie(event:MouseEvent):void{
vidplaying = true;
wait_mc.visible = true;
(yoru flv and netstream stuff) ect
}
ns.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
function netStatus(e:NetStatusEvent) {
if(vidplaying == true && e.info.code == "NetStream.Buffer.Empty"){
wait_mc.visible = true;
}
if(e.info.code == "NetStream.Buffer.Full"){
wait_mc.visible = false;
}
}// netStatus