Обнаруживать, когда аудиопоток HTML5 прерывается или приостанавливается

Я пытаюсь передать URL-адрес Shoutcast с помощью HTML5 Audio в приложении Cordova.

Проблема, с которой я столкнулся, заключается в следующем: похоже, что обратный вызов не срабатывает, когда аудиопоток теряет соединение с URL-адресом ShoutCast. На этом этапе звуковой элемент показывает, что он воспроизводит аудио, но звука нет.

Код

Radio = {
    initialized: false,
    isBuffering: false,
    interrupted: false,
    isPlaying: false,
    media: null,
    trackName: '',
    url: 'shoutcast_url',
    initialize: function () {
        if (!this.media) {
            this.media = new Audio(this.url);

            this.media.preload = "none";

            this.media.onerror = function (e) {
                App.alert("Unable to connect to Radio");
                Radio.interrupt();
            };

            this.media.onwaiting = function (e) {
                Radio.set_buffering(true);
            };

            this.media.onplaying = function (e) {
                Radio.set_buffering(false);
            };
        }
    },
    set_buffering: function (value) {
    ...
    }

сценарий

  • Подключитесь к Интернету (скажем, через горячую точку) и запустите аудио-радио.
  • Отключите точку доступа из Интернета.

После воспроизведения буферизованного содержимого звук перестает воспроизводиться. Но не вызываются обратные вызовы, которые указывают на потерю соединения.

  • media.networkState - 2 (NETWORK_LOADING)
  • media.playbackRate - 1 (воспроизведение вперед с обычной скоростью)
  • media.readyState - 4 (HAVE_ENOUGH_DATA)
  • media.preload none

Обратные вызовы, которые я пробовал (которые не срабатывали, когда соединение было потеряно):

  • onstalled
  • onreset
  • onsuspend
  • onerror
  • onprogress
  • onwaiting

Вопрос. Есть ли звуковой обратный вызов, который срабатывает, когда он не может воспроизвести звук из-за отсутствия соединения?

Если нет, есть ли какой-либо метод, который будет обновлять readyState или networkState? Если это так, я могу просто установить таймер для проверки этих значений.

Ответ 1

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

Событие timeupdate запускается, когда время, указанное в атрибуте currentTime, обновлено.

Событие срабатывает только при воспроизведении звука. Если звук останавливается, по какой-либо причине время timeupdate не срабатывает.

Однако поддержка браузера не завершена.

  • На Android 5.0 (Chrome 48), timeupdate никогда не срабатывает и не обновляется currentTime.
  • В новейших настольных браузерах (Mozilla 45 и Chrome 49) функции timeupdate документируются.

Ответ 2

Вы уверены, что потеря соединения - это то, что вы хотите? Звук может прекратиться, и ваше соединение будет эффективно потеряно без фактического закрытия закрытого TCP-соединения. У вас не может быть данных в течение нескольких часов, фактически мертвое соединение, но все же есть это TCP-соединение.

Вместо этого я бы рекомендовал посмотреть время воспроизведения. (Ваш обработчик onprogress также эффективен.) Если это не увеличивается после установленного вами таймаута (10 секунд или того, что подходит для вашей ситуации), затем очистите аудиоплеер и попытайтесь снова подключиться.

Ответ 3

В html5 аудио есть следующие события: May onempted, onabort, oninvalid, onplaying, onreset, onseeking, могут помочь?

OnAbort oncanplay oncanplaythrough OnChange ondurationchange onemptied onended oninput oninvalid OnKeyDown OnKeyPress OnKeyUp OnLoad onloadeddata onloadedmetadata onloadstart OnMouseDown OnMouseEnter OnMouseLeave OnMouseMove onmouseout OnMouseOver OnMouseUp OnPause onplay onplaying OnProgress onratechange OnReset OnResize OnScroll onseeked onseeking onselect OnShow onstalled onsubmit onsuspend ontimeupdate onvolumechange onwaiting onmozfullscreenchange onmozfullscreenerror onmozpointerlockchange onmozpointerlockerror OnError OnClick oncontextmenu ondblclick ondrag ondragend ondragenter ondragleave

Ответ 4

Вы можете прослушать онлайн- событие для перезапуска потока:

window.addEventListener('online', function() {
  audio.play();
});