Android + JS + Audio
Доброго времени суток, уважаемые форумчане!
При разработке одной странички возникла проблема с хитрым элементом Audio. Суть проблемы такова: Необходимо воспроизвести некий файл из группы файлов, в зависимости от некоторых данных на странице, которые могут измениться. В функции-обработчике события при изменении вызывается функция воспроизведения. Но ничего не воспроизводится... Объект испытаний: Планшет на базе ОС Android 4.4.2, браузер Google Chrome Код функции и ее вызов происходят так: var playing = 0; function PlaySound() { if (playing != 0) return; var Sound = new Audio(); Sound.src = Sounds[InputData]; Sound.onended = function() { playing = 0; console.log("PL = 0\r\n"); }; playing = 1; console.log("PL = 1\r\n") Sound.load(); Sound.play(); } ...бла-бла-бла... PlaySound(); Провожу отладку через JSConsole на компьютере и вижу следующее: PL = 1 ...и больше ничего. Ни звука, ни каких-либо сообщений об ошибке. Пишу в консоли: playing = 0 Делаю так, чтобы событие произошло и история повторяется... Добавляю кнопку, для "принудительного" вызова функции (данные ВСЕГДА находятся в диапазона массива Sounds), нажимаю и... Звук есть и в консоли вижу все, что нужно: PL = 1 PL = 0 Может кто сталкивался с этой проблемой и может что-нибудь подсказать? |
… Sound.oncanplay = function () { Sound.play(); }; … |
Пробовал... Результат тот же... Вернул обратно, т.к. считаю, что это событие бесполезно, если файл хранится в переменной, в кодировке Base64 с описанием MIME-типа audio/mpeg
|
Нашел такую особенность...
Вызов функции делался так: if (LastParam != Param) PlaySound(); Это, очевидно, нужно для того, чтобы при обработке этого события, озвучивался параметр только при его изменении. НО... Если условие убрать и оставить только вызов PlaySound, то звук есть. Может я чего-то совсем не понимаю?! Или есть какая особенность? Ну же, профессионалы, помогите новичку разобраться и выполнить поставленную задачу :) |
Упрощаем и изменяем задачу до нельзя, чтобы понять проблему. Функция:
function PlaySound() { var Sound = new Audio(); Sound.src = Sounds[1]; Sound.load(); Sound.oncanplay = function() { Sound.play(); console.log("ok\r\n"); }; console.log("loading..."); } Если вызываю функцию по кнопке - звук есть, в консоли вижу "loading...ok". Если вызываю по таймеру: setInterval("PlaySound();", 5000); Звука нет, но в консоли вижу "loading...ok". Неужели никто не сталкивался? Может хоть идеи какие будут? |
С неоценимой помощью форумчан, а так же чуть-чуть интернета и спецификаций различного рода, причина такого недуга была найдена. Если у кого-то еще будет подобная заморочка, вот причина: в соответствии с непонятными политиками операционных систем Android и iOS, медиа на странице не может работать без предшествующего включению "тапа" по экрану. А дальше думайте сами :)
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 16:09. |