Автовоспроизведение аудиофайлов на iPad с HTML5

Я пытаюсь настроить автозапуск аудиофайла в Safari на iPad. Если я перейду на страницу с помощью Safari на моем Mac, все в порядке. На iPad автовоспроизведение не работает.


person milesmeow    schedule 09.06.2010    source источник
comment
Это не ответ, а просто наблюдение. Когда я подключил WireShark к iPad, я заметил, что он не запускается автоматически, но все равно загружает файл Wave. Первый HTTP-запрос Get просто запрашивает первые 2 байта файла, но затем iPad запрашивает оставшуюся часть Wave-файла в еще нескольких запросах Get. Что еще более странно, когда вы нажимаете кнопку «Воспроизвести» аудиокомпонента, iPad снова перезагружает файл Wave.   -  person Javamann    schedule 26.09.2011


Ответы (15)


ОБНОВЛЕНИЕ. Это взлом, и он больше не работает на iOS 4.X и выше. Этот работал на IOS 3.2.X.

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

Вот решение для «поддельного нажатия javascript»: http://www.roblaplaca.com/examples/html5AutoPlay/

Скопируйте и вставьте код с сайта:

<script type="text/javascript"> 
        function fakeClick(fn) {
            var $a = $('<a href="#" id="fakeClick"></a>');
                $a.bind("click", function(e) {
                    e.preventDefault();
                    fn();
                });

            $("body").append($a);

            var evt, 
                el = $("#fakeClick").get(0);

            if (document.createEvent) {
                evt = document.createEvent("MouseEvents");
                if (evt.initMouseEvent) {
                    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    el.dispatchEvent(evt);
                }
            }

            $(el).remove();
        }

        $(function() {
            var video = $("#someVideo").get(0);

            fakeClick(function() {
                video.play();
            });
        });

        </script> 

Это не мой источник. Я нашел это некоторое время назад и протестировал код на IPad и IPhone с IOS 3.2.X.

person Fa11enAngel    schedule 16.06.2010
comment
Вот еще один обходной путь: codeblog.co/getting-autoplay-working-on-ios Я только что убедился, что это работает на iPad с iOS 3.2. - person Ciryon; 08.09.2010
comment
Не тратьте на это свое время, так как он больше не работает с iOS 4+. - person jcampbell1; 20.06.2011

Я также хотел бы подчеркнуть, что причина, по которой вы не можете этого сделать, - это бизнес-решение, принятое Apple, а не техническое решение. То есть, у Apple не было рационального технического обоснования для отключения звука из веб-приложений на iPod Touch. Это только устройство Wi-Fi, а не телефон, который может нести дорогостоящую плату за пропускную способность, так что этот аргумент не имеет смысла для этого устройства. Они могут сказать, что помогают с управлением сетью Wi-Fi, но любые проблемы с пропускной способностью в моей сети Wi-Fi - это меня, а не Apple.

Кроме того, если бы они действительно заботились о предотвращении нежелательного чрезмерного потребления полосы пропускания, они бы предоставили настройку, позволяющую пользователям выбирать звуки веб-приложений. Кроме того, они будут делать что-то, чтобы ограничить использование веб-сайтами эквивалентной полосы пропускания другими способами. Но таких ограничений нет. Веб-сайт может загружать огромные файлы в фоновом режиме снова и снова, и Apple это не заботит. И, наконец, я считаю, что звуки в любом случае можно скачать, так что ПОЛОСА ДЕЙСТВИТЕЛЬНО НЕ СОХРАНЯЕТСЯ! Apple просто не позволяет им играть автоматически без взаимодействия с пользователем, что делает их непригодными для игр, что, конечно же, является их истинным намерением.

Apple заблокировала звук, потому что они начали замечать, что приложения HTML5 могут быть такими же функциональными, как и собственные приложения, если не больше. Если вам нужен звук в веб-приложениях, вам нужно лоббировать Apple, чтобы она перестала быть антиконкурентной, как Microsoft. Здесь нет технических проблем, которые можно было бы исправить.

person Rick M    schedule 04.02.2011
comment
Разве это не так для Android? - person Rune Jeppesen; 18.09.2016
comment
@Rune Jeppesen: Нет. У меня есть приложение PhoneGap / Cordova, в котором есть аудиоплеер, и оно отлично работает на Android. Единственная причина, по которой я затронул эту тему здесь, в StackOverflow, - это ограничения iOS в отношении воспроизведения звука. - person Ulysses Alves; 14.11.2017
comment
Теперь в Chrome для Android и для ПК действует политика, аналогичная iOS. - person Ore4444; 02.05.2018

Apple досадно отвергает многие веб-стандарты HTML5 на своих устройствах iOS по разным причинам бизнеса. В конечном счете, вы не можете предварительно загружать или автоматически воспроизводить звуковые файлы перед событием касания, он воспроизводит только один звук за раз и не поддерживает Ogg / Vorbis. Тем не менее, я нашел одно отличное решение, которое позволит вам немного больше контролировать звук.

<audio id="soundHandle" style="display:none;"></audio>

<script type="text/javascript">

var soundHandle = document.getElementById('soundHandle');

$(document).ready(function() {
    addEventListener('touchstart', function (e) {
        soundHandle.src = 'audio.mp3';
        soundHandle.loop = true;
        soundHandle.play();
        soundHandle.pause();
    });
});

</script>

По сути, вы начинаете воспроизведение аудиофайла при самом первом событии касания, а затем сразу же приостанавливаете его. Теперь вы можете использовать команды soundHandle.play () и soundHandle.pause () в своем Javascript и управлять звуком без сенсорных событий. Если вы можете точно рассчитать время, просто сделайте паузу сразу после того, как звук закончится. Затем, когда вы снова проиграете его, он вернется к началу. Это не решит весь беспорядок, который здесь устроила Apple, но это одно решение.

person kaleazy    schedule 04.05.2012
comment
Я еще не пробовал, но если это действительно работает, это прекрасно. - person courtsimas; 18.09.2012
comment
Удивлен, что больше людей это не интересует. - person aoeu256; 29.10.2014
comment
Это все еще работает? Кажется, я могу заставить это работать ... - person zillaofthegods; 21.04.2017
comment
@MastaBaba Это должен быть принятый ответ. Почему? Он не отвечает на вопрос, так как OP запрашивает следующее: Я пытаюсь получить аудиофайл для автовоспроизведения в Safari, и этот ответ не помогает. с автовоспроизведением. - person debute; 02.08.2017

Начиная с iOS 4.2.1, ни фальшивый щелчок, ни трюк .load () не будут работать для автовоспроизведения звука на любом устройстве iOS. Единственный известный мне вариант - это заставить пользователя фактически выполнить действие щелчка и начать воспроизведение в обработчике события щелчка без обертывания вызова .play () чем-либо асинхронным (ajax, setTimeout и т. Д.).

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

person David Gouldin    schedule 23.11.2010
comment
Я могу убедиться, что у меня есть код, работающий для автовоспроизведения звука без вмешательства пользователя как на iPad, так и на iPod touch, до 4.2.1. Я только что обновил свой iPad до версии 4.2.1 сегодня (как раз в середине тестирования моего аудио-прелоадера) и с ужасом наблюдал, как он просто перестал работать. - person Jason Kester; 01.12.2010
comment
На <video> с 4.2.1 я убедился, что пока .load(), затем .play() входит в синхронный обработчик щелчков и касаний, он будет работать. В противном случае это не удается. - person N Rohler; 17.02.2011
comment
Кажется, что программное управление элементами мультимедиа (аудио и видео) включается после взаимодействия с пользователем для каждого элемента мультимедиа. Т.е. если у вас есть аудиоэлементы A и B, и вы начинаете воспроизведение A через код в рамках обработчика событий щелчка (или касания), он работает. Но это не означает, что вы можете позже начать воспроизведение B вне области действия обработчика события щелчка. Рассматривайте элементы мультимедиа в iOS как единичный элемент и меняйте источники в одном экземпляре, а не умножайте экземпляры на источники. - person Tim Erickson; 31.12.2011

Я подтверждаю, что звук работает не так, как описано (по крайней мере, на iPad 4.3.5). Конкретная проблема заключается в том, что звук не загружается в асинхронном методе (ajax, событие таймера и т. Д.), Но он будет воспроизводиться, если он был предварительно загружен. Проблема в том, что нагрузка должна быть связана с событием, инициированным пользователем. Итак, если у вас есть кнопка для запуска игры пользователем, вы можете сделать что-то вроде:

function initSounds() {
    window.sounds = new Object();
    var sound = new Audio('assets/sounds/clap.mp3');
    sound.load();
    window.sounds['clap.mp3'] = sound;
}

Затем, чтобы воспроизвести его, например, в запросе ajax, вы можете сделать

function doSomething() {
    $.post('testReply.php',function(data){
        window.sounds['clap.mp3'].play();
    }); 
}

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

Изменить: я нашел объяснение Apple, и оно влияет на iOS 4+: http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html

person Jacob Mouka    schedule 03.11.2011
comment
Это золотой ответ. Вы можете заполнить звуковой объект несколькими звуками. И после вызова ajax в случаях успеха / ошибки воспроизводите все, что хотите. У меня работает на всех устройствах! Большое спасибо !!! - person Andris; 11.04.2018

Попробуйте вызвать метод .load () перед методом .play () для тега аудио или видео ... который будет соответственно HTMLAudioElement или HTMLVideoElement. Для меня это был единственный способ работать на iPad!

person Brian Brown    schedule 22.06.2010
comment
Согласно документам разработчика Apple, ни .load, ни .play не будут работать, за исключением случаев, когда пользователь запускает их. - person Jeffrey Van Alstine; 11.05.2016

Автовоспроизведение не работает на iPad или iPhone ни для видео, ни для аудио тегов. Это ограничение установлено Apple для экономии полосы пропускания пользователей.

person Andrew    schedule 10.06.2010

Мне кажется, что ответ на этот вопрос (по крайней мере, сейчас) четко задокументирован в Документы Safari HTML5:

Пользовательский контроль загрузок по сотовым сетям

В Safari на iOS (для всех устройств, включая iPad), где пользователь может быть в сотовой сети и платить за единицу данных, предварительная загрузка и автовоспроизведение отключены. Никакие данные не загружаются, пока пользователь не инициирует их. Это означает, что методы play () и load () JavaScript также неактивны до тех пор, пока пользователь не инициирует воспроизведение, если только метод play () или load () не запускается действием пользователя. Другими словами, инициированная пользователем кнопка воспроизведения работает, а событие onLoad = "play ()" - нет.

Это воспроизводит фильм: <input type="button" value="Play" onClick="document.myMovie.play()">

На iOS ничего не делает: <body onLoad="document.myMovie.play()">

person Adrian    schedule 17.11.2011

Мы ломали голову над этим при разработке быстрого прототипа веб-приложения под iOS4.2 (сборка для разработчиков). Решение на самом деле довольно простое. Обратите внимание, что похоже, что у вас уже не может быть тега на вашей HTML-странице, вам действительно нужно динамически вставлять тег в документ (обратите внимание, что в этом примере используется Prototype 1.7 для некоторой дополнительной привлекательности Javascript):

this.soundFile = new Element("audio", {id: "audio-1", src: "audio-1.mp3", controls: ""});
document.body.appendChild(this.soundFile);
this.soundFile.load();
this.soundFile.play();

Поскольку вы не установили контроллер, не должно быть никакой необходимости делать какие-либо хитрости с CSS, чтобы скрыть его / разместить за пределами экрана.

Кажется, это работает отлично.

person Jon Jardine    schedule 03.12.2010

Apple не поддерживает стандарт полностью, но есть обходной путь. Их оправдание - это перегрузка сотовой сети, возможно, потому, что вы попадете на страницы, которые воспроизводят случайный звук. Это поведение не меняется, когда устройство подключается к Wi-Fi, возможно, для согласованности. Между прочим, эти страницы в любом случае - плохая идея. Вы не должны пытаться разместить саундтрек на каждой веб-странице. Это просто неправильно. :)

html5-звук будет воспроизводиться, если он запущен в результате действия пользователя. Загрузка страницы не в счет. Таким образом, вам необходимо реструктурировать свое веб-приложение, чтобы оно стало универсальным на одной странице. Вместо ссылки, открывающей страницу, на которой воспроизводится звук, вам нужна эта ссылка, чтобы воспроизвести его на текущей странице без изменения страницы. Это правило «взаимодействия с пользователем» применяется к методам html5, которые вы можете вызывать для аудио- или видеоэлементов. Вызовы возвращаются без какого-либо эффекта, если они запускаются автоматически при загрузке страницы, но они работают при вызове из обработчиков событий.

person bmidgley    schedule 12.10.2011

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

person Luke Stanley    schedule 14.10.2011

Если вы создаете элемент Audio, используя:

var a = new Audio("my_audio_file.wav");

И добавьте прослушиватель событий suspend через:

a.addEventListener("suspend", function () {console.log('suspended')}, false);

А затем загрузите файл в мобильный Safari (iPad или iPhone), вы увидите, что «приостановлено» войдет в консоль разработчика. Согласно спецификации HTML5, это означает: «Пользовательский агент намеренно в данный момент не загружает медиа-данные, но не загружает весь медиаресурс».

Вызов последующего a.load (), проверка события "canplay" и последующее использование a.play () кажется подходящим методом для автоматического запуска звука.

person Vince    schedule 02.01.2011
comment
Я пробовал это, но похоже, что это не работает. Есть обновления? sandbox.coolaj86.info/html5-audio-tag-ios4.html - person coolaj86; 05.02.2011

Работает с jQuery, протестировано на Ipad v.5.1.1.

$('video').get(0).play();

Вы должны добавить / удалить элемент видео со страницы.

person Adrian    schedule 19.10.2012
comment
Не работает на iPad 1 iOS 5.1.1 ... хотя работает на iPod 6.0 и iPhone - person morgan_il; 16.12.2012

Я обработал это, прикрепив обработчик событий для всех событий, для которых вам разрешено запускать звук, к элементу body, который запускает любые аудиоэлементы html с автовоспроизведением для однократного воспроизведения.

var mobile = /iPad|iPhone|iPod|android/.test(navigator.userAgent) && !window.MSStream;
if (mobile) {
    $('body').on('touchstart click doubleclick keydown', function() {
        $("audio[autoplay='autoplay']").each(
            function(){
                this.play();
                this.removeAttribute('autoplay');
            });
    });
}
person Andrew Hancox    schedule 30.05.2017

Кажется, это работает:

<html>
<title>
iPad Sound Test  - Auto Play
</title>
</head>
<body>
<audio id="audio" src="mp3test.mp3" controls="controls" loop="loop">
</audio>
<script type="text/javascript"> 
    window.onload = function() {
        var audioPlayer = document.getElementById("audio");
        audioPlayer.load();
        audioPlayer.play();
    };
    </script> 

</body>
</html>

Посмотрите, как это работает здесь: https://web.archive.org/web/20101108095801/http://www.johncoles.co.uk/ipad/test/1.html

Начиная с iOS 4.2 это больше не работает. Извините.

person John Coles    schedule 10.09.2010
comment
@ NisseEngström Мне кажется, что mp3-файл тоже не заархивирован, поэтому редактирование ссылки на архив довольно спорно. - person Goodbye StackExchange; 17.07.2017
comment
@FrankerZ: Есть ссылка на mp3? Я пропустил это. Спасибо. - person Nisse Engström; 17.07.2017