Html5 Audio воспроизводится только один раз в моем коде JavaScript - PullRequest
3 голосов
/ 24 апреля 2010

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

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

var error_audio = new Audio("audio/"+settings.refresh.error_audio);
error_audio.load();

//this gets called when there is a connection error.
function onConnectionError() {
   error_audio.play();
}

Однако во 2-й раз через функцию звук не воспроизводится. Копаясь в отладчике Chrome, атрибут «Play» в аудиоэлементе устанавливается в true. Установка в false не имеет результатов. Есть идеи?

Ответы [ 6 ]

3 голосов
/ 21 августа 2012

Я столкнулся с этим только сегодня, после дополнительных поисков я обнаружил, что вы должны снова установить свойство source для элемента audio, чтобы перезапустить его. Не волнуйтесь, никакая сетевая активность не происходит, и операция сильно оптимизирована.

var error_audio = new Audio("audio/"+settings.refresh.error_audio);
error_audio.load();

//this gets called when there is a connection error.
function onConnectionError() {
   error_audio.src = "audio/"+settings.refresh.error_audio;
   error_audio.play();
}

Такое поведение выражено в chrome 21. FF, похоже, тоже не против дважды установить src!

1 голос
/ 03 января 2014

Вам необходимо приостановить звук непосредственно перед его окончанием и изменить текущее время воспроизведения на ноль, а затем воспроизвести его. Javascript / Jquery для управления звуковыми элементами HTML5 - проверьте эту ссылку - объясняется How to handle/control the HTML5 audio elements?. Это может помочь вам!

1 голос
/ 15 ноября 2012

В: Я ПОЛУЧИЛ AUDIOBUFFERSOURCENODE, ЧТО Я ПРОСТО ИГРАЛ НАЗАД С NOTEON (), И ХОЧУ ИГРАТЬ В НОВОМУ, НО НОЧЬ () НИЧЕГО НЕ ДЕЛАЕТ! ПОМОГИТЕ!

A: Как только исходный узел закончил воспроизведение, он больше не сможет воспроизводить. Чтобы снова воспроизвести базовый буфер, вы должны создать новый AudioBufferSourceNode и вызвать noteOn ().

Хотя воссоздание исходного узла может показаться неэффективным, исходные узлы сильно оптимизированы для этого шаблона. Кроме того, если вы держите дескриптор AudioBuffer, вам не нужно делать еще один запрос к ресурсу, чтобы снова воспроизвести тот же звук. Если вам нужно повторить этот паттерн, инкапсулируйте воспроизведение с помощью простой вспомогательной функции, например playSound (buffer).

Q: КОГДА ИГРАТЬ НАЗАД ЗВУКА, ПОЧЕМУ ВАМ НУЖНО СДЕЛАТЬ НОВЫЙ УЧАСТОК ИСТОЧНИКА КАЖДЫЙ РАЗ?

A: Идея этой архитектуры состоит в том, чтобы отделить аудио актив от состояния воспроизведения. По аналогии с проигрывателем, буферы аналогичны записям и источникам для игровых голов. Поскольку во многих приложениях одновременно используется несколько версий одного и того же буфера, этот шаблон очень важен.

Источник:

http://updates.html5rocks.com/2012/01/Web-Audio-FAQ

1 голос
/ 24 апреля 2010

Попробуйте установить error_audio.currentTime в 0 перед воспроизведением. Может быть, он не вернется к началу автоматически

0 голосов
/ 11 февраля 2013

Chrome / Safari исправили эту проблему в более новых версиях браузера, и приведенный выше код теперь работает как положено.Я не уверен, какая именно версия была исправлена.

0 голосов
/ 31 августа 2010

Вам необходимо реализовать заголовки ответов Content-Range, поскольку Chrome запрашивает файл из нескольких частей через HTTP-заголовок Range.

См. Здесь: HTML5 Прямая трансляция Safari против

Как только это будет реализовано, должна работать как функция play(), так и настройка свойства currentTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...