2009-03-21 4 views
5

Я создаю базовый MP3-плеер в ActionScript 3. У меня есть базовый индикатор выполнения, который показывает, сколько из песни сыграло. Прогресс рассчитываются как процент десятичного нормализован в пределах от 0 до 1, как, например:Как получить конечную длину объекта Звук, который все еще загружается?

var progress:Number = channel.position/sound.length; 

Проблемы в том, если аудио по-прежнему загрузка/буферизация sound.length является неправильным. Это заставляет мой индикатор выполнения пропускать и даже перемещаться назад, пока звук не будет полностью загружен, а sound.length больше не изменяется.

Каков наилучший способ определения конечной длины звукового объекта, который все еще загружается?

ответ

6

Есть как минимум два варианта:

1: Оставьте свой прогресс бар при 0%, и не двигайтесь, пока звук не будет загружен полностью. То есть:

sound.addEventListener(Event.COMPLETE, onSoundComplete); 

private function onSoundComplete(event:Event):void { 
    // Calculate progress 
} 

2: Ориентировочный процент в зависимости от процента загруженного файла. Что-то вроде этого:

private var _sound:Sound = /* Your logic here */; 
private var _channel:SoundChannel = _sound.play(); 

_sound.addEventListener(ProgressEvent.PROGRESS, onSoundProgress); 

private function onSoundProgress(event:ProgressEvent):void { 
    var percentLoaded:Number = event.bytesLoaded/event.bytesTotal; 
    var approxProgress:Number 
     = _channel.position/_sound.length * percentLoaded; 
    // Update your progress bar based on approxProgress 
} 
+0

Вторая идея замечательная! Он должен быть достаточно точным в течение нескольких миллисекунд из того, что я могу сказать. – Soviut

2

Вы также можете узнать длину звука через его ID3 тега, если звук был правильно tagged.

Смежные вопросы