Как я могу заставить аудиоэлемент HTML5 буферизовать всю песню?

Я разрабатываю локальный сервер, который будет транслировать аудиофайлы пользователя, чтобы они могли получить к ним доступ через веб-браузеры с помощью аудиообъекта HTML5. Поскольку эти файлы находятся на компьютере пользователя, я ожидаю, что файлы будут полностью буферизованы при загрузке, но для некоторых больших файлов песни частично буферизуются, затем останавливаются и возобновляют буферизацию через некоторое время.

Мой вопрос: как я могу заставить аудиообъект буферизовать всю песню сразу? Могу ли я сделать это из javascript, нужно ли устанавливать атрибут для аудиообъекта или есть что-то еще, что я могу сделать?


person George    schedule 21.01.2011    source источник


Ответы (3)


Решение, которое я нашел, было следующим:

function load() {
    a.play();
    setTimeout("a.pause()", 10);
}

Воспроизведите файл и приостановите его через 10 мс, после чего браузер буферизует всю песню.

person Ahi Tuna    schedule 10.02.2012
comment
setTimeout(a.pause, 10) лучшая карма - person Tamas Czinege; 24.02.2012
comment
Это работает, когда вы не передаете функции какие-либо переменные, конечно. Но зачем переключаться между двумя методами? - person Ahi Tuna; 28.02.2012
comment
@DrJokepu На самом деле это не сработает, так как вы потеряете контекст функции. Лучше: setTimeout(a.pause.bind(a), 10) - person nickf; 11.04.2012

Вы можете использовать метод load(). Это в основном заставляет preload="auto". Но это, вероятно, не будет буферизовать все это.

У меня была проблема, что звук не был предварительно загружен на мобильные устройства (даже с preload=auto), но этот метод сработал.

http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dfnReturnLink-2

Другой вариант — загрузить данные через XMLHttpRequest в виде двоичного большого двоичного объекта и установить для атрибута src элемента <audio> значение URI большого двоичного объекта.

(Лично мне не очень нравится хак воспроизведения/паузы.)

person ayke    schedule 27.02.2013

Вы можете установить атрибут preload="auto". Не гарантируется, что он что-то сделает, но предполагается, что пользовательский агент должен буферизовать столько, сколько он хочет, не заботясь об удаленном конце. http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#attr-media-preload

person joeforker    schedule 21.01.2011