Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Буферизация аудио (https://javascript.ru/forum/events/33844-buferizaciya-audio.html)

tropiko 10.12.2012 21:54

Буферизация аудио
 
Приветствую!

Возникла проблема с буферизацией аудио, точнее с ее попыткой ее индикации.

Подробнее.
Создаю объект Audio, указываю трек.
var player = new Audio();
player.setAttribute('src', 'http://www.codebasehero.com/files/music-player/demo/mix/1.mp3');

player.addEventListener('progress', function(){
var buffered = this.buffered.end(0);
console.log(buffered);
});

player.play();

Пример на jsfiddle, музыкальный отрывок 30 сек -- http://jsfiddle.net/yH8t5/1/

Cуть такова. При первом обращении файл загружается и буферизуется нормально и в консоль выводится время конца буферизованного фрагмента. Но если не дождаться полной загрузки и отключить аудио (не важно, каким способом, закрыть вкладку, грубо говоря), то при повторном обращение выдается ошибка:
Uncaught Error: IndexSizeError: DOM Exception 1

И нормальное выполнение события 'progress' будет только тогда, когда будет достигнут еще не буферизированный фрагмент.
В общем, я так себе представляю ситуацию.

Вопросов несколько: что я делаю не так и как узнать длину уже буферизированного фрагмента правильно?

Спасибо.

Brook 10.12.2012 22:36

а значение буфера на "0" не легче сбивать при подключении?

tropiko 11.12.2012 05:23

Brook, бред

tropiko 11.12.2012 12:22

Путем рассматривания дебрей вконтактовского HTLM5-плеера родилось вот что

var player = new Audio();
player.setAttribute('src', 'http://dl.dropbox.com/u/95730813/1.mp3');
player.load();

var time = 276.331;

var onProgress = function(){
   var buffered;
   try{
       buffered = (Math.floor(this.buffered.end(0) * 1000) / 1000) || 0;
   }catch(e){}
   if(time && Math.abs(time - buffered) < 0.1){
       console.log('Buffered: 100%');
       this.removeEventListener('progress', onProgress);
   }else{
       var percent = Math.ceil(buffered / time * 100);
       
       percent = Math.min(100, Math.max(0, percent));
       if(!isNaN(percent)){
           console.log('Buffered: '+ percent +'%');
       }
    }
}

player.addEventListener('progress', onProgress);

$(document).ready(function(){
    player.play();
});​

http://jsfiddle.net/yH8t5/3/

Адовый костыль, т.к. нужно знать длину трека изначально. В моем конкретном случае это не критично, но костыль.

Еще хотелось бы прочитать мнение более умных людей, чем я, как решать эту проблему :)


Часовой пояс GMT +3, время: 04:39.