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, время: 22:21. |