Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.12.2012, 21:54
Аватар для tropiko
Аспирант
Отправить личное сообщение для tropiko Посмотреть профиль Найти все сообщения от tropiko
 
Регистрация: 23.06.2011
Сообщений: 44

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

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

Подробнее.
Создаю объект 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' будет только тогда, когда будет достигнут еще не буферизированный фрагмент.
В общем, я так себе представляю ситуацию.

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

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 10.12.2012, 22:36
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

а значение буфера на "0" не легче сбивать при подключении?
Ответить с цитированием
  #3 (permalink)  
Старый 11.12.2012, 05:23
Аватар для tropiko
Аспирант
Отправить личное сообщение для tropiko Посмотреть профиль Найти все сообщения от tropiko
 
Регистрация: 23.06.2011
Сообщений: 44

Brook, бред
Ответить с цитированием
  #4 (permalink)  
Старый 11.12.2012, 12:22
Аватар для tropiko
Аспирант
Отправить личное сообщение для tropiko Посмотреть профиль Найти все сообщения от tropiko
 
Регистрация: 23.06.2011
Сообщений: 44

Путем рассматривания дебрей вконтактовского 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/

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень простой вопрос про аудио и JS eirnvn jQuery 8 08.07.2013 14:39
jquery аудио плеер: плейлист не отображается в firefox roy-aron jQuery 0 27.06.2012 17:20
Проблема при воспроизведении аудио при использовании jplayer nemish Events/DOM/Window 0 01.12.2011 16:15
Онлайн Видео и аудио конференции mycoding Оффтопик 11 21.10.2010 18:06
Пофиксана буферизация в разделе Server push Илья Кантор Сайт Javascript.ru 1 09.01.2010 15:57