Браузер Android выгружает аудио элемент HTML5 после каждого воспроизведения (), вызывая задержку - PullRequest
3 голосов
/ 07 июля 2011

У меня есть простое приложение, которое многократно воспроизводит короткий звук, вызывая метод play () для элемента audio в JavaScript. Он хорошо работает в настольных браузерах, iPad, iPhone и т. Д. На мобильном устройстве под управлением Android 2.3.3 при первом воспроизведении звука я слышу его сразу после вызова метода play (), но при последующих вызовах возникает заметная и переменная задержка.

Я немного поработал и обнаружил, что устройство загружает аудиофайл с сервера каждый раз, когда вызывается метод play (). Я могу вызвать метод load () для аудиоэлемента, чтобы перезагружать его после каждого воспроизведения, таким образом ставя его в очередь для следующего воспроизведения, но есть ряд проблем с этим вспомогательным устройством. Мне бы очень хотелось, чтобы браузер просто постоянно загружал аудио элемент, а не выгружал его, как только он заканчивает воспроизведение. Кто-нибудь знает, возможно ли это?

РЕДАКТИРОВАТЬ: я провел немного больше исследований, и я обнаружил, что после воспроизведения звука, состояние готовности аудиоэлемента остается на HAVE_ENOUGH_DATA, даже если браузер не будет воспроизводить этот звук снова без повторного получения сервер. Я считаю, что это ошибка. Я надеялся использовать readystate для обнаружения браузеров, которые выгружаются после воспроизведения и загружаются явно только при необходимости, но это не сработает.

Ответы [ 3 ]

5 голосов
/ 08 июля 2011

Чем больше экспериментов я делаю, тем больше грубых краев я нахожу в реализации 2.35 аудио тега HTML5 в Android 2.3.3. Там много чего сломано, по крайней мере, на телефоне Droid X, который я использую для тестирования.

Лучшее, что я до сих пор придумал, - это лейкопластырь, на который ссылается мой первоначальный вопрос: как только вызов play () завершится, вызовите метод load (), чтобы подготовиться к следующему play (). :

if (navigator.userAgent.toLowerCase().indexOf("android") > -1)
  audElt.addEventListener('ended', function () {
    var t = setTimeout(function () { audElt.load(); }, 1000);
  }, false);

Мне пришлось ограничить обходные пути для пользовательских агентов Android, потому что простой вызов метода load () создает проблемы в Chrome и создает ненужные поездки на сервер в системах, отличных от Android.

Мне пришлось добавить задержку в 1 секунду, потому что, если я просто вызвал load () из обработчика «закончилась», это прервало воспроизведение, которое, по-видимому, еще не «закончилось» ....

Конечно, он по-прежнему несколько раз извлекает звук с сервера, поэтому, если вы попытаетесь воспроизвести его несколько раз подряд, все пойдет на юг.

0 голосов
/ 22 февраля 2012

Вы можете привязать updatetime к pause() воспроизведению за секунду до достижения конца звука и перемотать его перед воспроизведением. Android не будет сбрасывать звук.

0 голосов
/ 21 октября 2011

лучшее решение, которое я нашел.Другой вариант - просто использовать тег видео, но с этим также есть некоторые проблемы.Кажется, ничего не работает достаточно хорошо для реализации.

к счастью, я использую пробел в телефоне, поэтому я попробую их аудио методы.

...