Автоматичне відтворення аудіофайлів на iPad з HTML5


88

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


1
Це не відповідь, а лише спостереження. Коли я підключив WireShark до свого підключення до iPad, я помітив, що він не буде автоматично відтворюватися, але все одно завантажує файл Wave. Перший HTTP Get просто запитує перші 2 байти файлу, а потім iPad запитує решту файлу Wave ще в деяких запитах Get. Що ще дивніше, це те, що після натискання кнопки «Відтворити» аудіокомпонента iPad знову завантажує файл Wave.
Javamann

Відповіді:


34

ОНОВЛЕННЯ: Це хакерство, і воно вже не працює на 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.


1
Ось ще одне обхідне рішення: codeblog.co/getting-autoplay-working-on-ios Я щойно перевірив, що це працює на iPad з iOS 3.2.
Ciryon

49
Не витрачайте час на це, оскільки це вже не працює з iOS 4+
jcampbell1

106

Я хотів би також підкреслити, що причиною того, що ви цього не можете зробити, є ділове рішення, яке прийняло Apple, а не технічне рішення. Насправді, для Apple не було раціонального технічного обґрунтування відключення звуку з веб-програм на iPod Touch. Це лише пристрій WiFi, а не телефон, який може спричинити дорогі витрати на пропускну здатність, тому цей аргумент має нульові переваги для цього пристрою. Вони можуть сказати, що допомагають в управлінні мережею WiFi, але будь-які проблеми з пропускною здатністю в моїй мережі WiFi - це моя проблема, а не проблема Apple.

Крім того, якщо те, що їх насправді турбує, запобігає небажаному, надмірному споживанню пропускної здатності, вони нададуть налаштування, щоб дозволити користувачам ввімкнути звуки веб-програм. Крім того, вони роблять щось, щоб обмежити веб-сайти споживати еквівалентну пропускну здатність іншими способами. Але таких обмежень немає. Веб-сайт може завантажувати величезні файли у фоновому режимі знову і знову, і Apple може про це менше піклуватися. І, нарешті, я вважаю, що звуки можна завантажити в будь-якому випадку, тож НАСАЖ НЕ ЗБЕРЕЖАЄТЬСЯ ПРОПУСК! Apple просто не дозволяє їм автоматично грати без взаємодії з користувачем, що робить їх непридатними для ігор, що, звичайно, є їхнім справжнім наміром.

Apple заблокувала звук, оскільки вони почали помічати, що програми HTML5 можуть бути такими ж здатними, як і власні програми, якщо не більше. Якщо ви хочете звук у веб-програмах, вам потрібно лобіювати Apple, щоб перестати бути антиконкурентними, як Microsoft. Тут немає технічної проблеми, яку тут можна усунути.


Чи не те саме для Android?
Rune Jeppesen

1
@Rune Jeppesen Ні. У мене є програма PhoneGap / Cordova, яка має аудіоплеєр, і вона чудово працює на Android. Єдина причина, чому я дійшов до цієї теми тут, у StackOverflow, - це обмеження iOS щодо відтворення аудіо.
Улісс Алвес,

Тепер це Chrome для Android і для настільних комп'ютерів має політику, подібну до iOS
Ore4444,

29

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, але це одне з рішень.


Я ще не пробував цього, але якщо це насправді працює, це чудово.
courtimas

3
Здивований, що більше людей цим не цікавляться.
aoeu256

Це все ще працює? Я, здається, зможу змусити це функціонувати ...
zillaofthegods

@MastaBaba Це повинна бути прийнята відповідь. Чому? Це не відповідає на запитання, оскільки саме про це вимагає OP: Я намагаюся отримати аудіофайл для автоматичного відтворення в Safari, і ця відповідь не допомагає з автоматичним .
дебют

23

Починаючи з iOS 4.2.1, ані підроблений клік, ані фокус .load () не працюватимуть для автоматичного відтворення звуку на будь-якому пристрої iOS. Єдиний варіант, який я знаю, - це зробити так, щоб користувач насправді виконував дію клацання та розпочинав відтворення в обробнику події кліку, не обертаючи виклик .play () у що-небудь асинхронне (ajax, setTimeout тощо).

Хтось, будь ласка, скажіть мені, якщо я помиляюся. У мене були робочі лазівки як для iPad, так і для iPhone до останнього оновлення, і всі вони виглядають так, ніби їх закрили.


5
Я можу підтвердити, що у мене був код, який працює для автоматичного відтворення звуку без втручання користувача як на iPad, так і на iPod touch, до 4.2.1. Я щойно оновив свій iPad до 4.2.1 сьогодні (в середині тестування мого попереднього завантажувача аудіо, як це трапляється), і з жахом спостерігав, як він просто перестав працювати.
Jason Kester

2
На <video>з 4.2.1, я перевірив , що до тих пір , як .load()тоді .play()прийти в синхронному обработчике натисніть / кран, він буде працювати. В іншому випадку це не вдається.
N Rohler

1
Здається, програмне управління елементами мультимедіа (аудіо та відео) увімкнене після взаємодії користувача з елементом мультимедіа . Тобто якщо у вас є аудіоелементи A і B, і ви починаєте відтворення A за допомогою коду в межах обробника події клацання (або дотику), це працює. Але це не означає, що пізніше ви можете розпочати відтворення B поза межами обробника події клацання. Ставтеся до медіа-елементів у iOS як до єдиного елемента та міняйте місцями джерела місцями замість того, щоб множити екземпляри на джерела.
Тім Еріксон,

10

Я підтверджую, що аудіо працює не так, як описано (принаймні на 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


Це золота відповідь. Ви можете заповнити об'єкт звуків кількома звуками. А після виклику Ajax у випадках успіху / помилок відтворіть будь-яке, що хочете. Працює для мене на кожному пристрої! Великий tnx !!!
Андріс,

7

Спробуйте викликати метод .load () перед методом .play () на аудіо- або відеотегу ... який буде HTMLAudioElement або HTMLVideoElement відповідно. Лише для мене це могло працювати на iPad!


Згідно з документами розробника apple, ні .load, ні .play не працюватимуть, за винятком випадків, коли їх ініціює користувач.
Джеффрі Ван Алстін,

5

Автовідтворення не працює на iPad або iPhone ні для відео, ні для аудіо тегів. Це обмеження, встановлене Apple, для економії пропускної здатності користувачів.


5

Мені здається, що відповідь на це запитання (принаймні зараз) чітко задокументована в документах Safari HTML5 :

Користувацький контроль завантажень через стільникові мережі

У Safari на iOS (для всіх пристроїв, включаючи iPad), де користувач може знаходитись у стільниковій мережі та платити за одиницю даних, попереднє завантаження та автоматичне відтворення вимкнено. Дані не завантажуються, поки користувач їх не ініціює. Це означає, що методи відтворення JavaScript () та завантаження () також неактивні, поки користувач не ініціює відтворення, якщо метод відтворення () або навантаження () не ініційований дією користувача. Іншими словами, ініційована користувачем кнопка відтворення працює, але подія onLoad = "play ()" ні.

Це відтворює фільм: <input type="button" value="Play" onClick="document.myMovie.play()">

Це не робить нічого для iOS: <body onLoad="document.myMovie.play()">


2

Здивувались цим, розробляючи швидкий прототип веб-програми під iOS4.2 (розробка розробника). Рішення насправді досить просте. Зверніть увагу, що ви, здається, вже не маєте тегу на своїй HTML-сторінці, вам фактично потрібно вставити тег в документ динамічно (зверніть увагу, цей приклад використовує прототип 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, щоб приховати його / розташувати поза екраном.

Здається, це працює чудово.


2

Apple не підтримує стандарт повністю, але є обхідне рішення. Їх обгрунтування є затори стільникової мережі, можливо тому, що ви потрапите на сторінки, які відтворюють випадковий звук. Ця поведінка не змінюється, коли пристрій переходить на Wi-Fi, можливо, для послідовності. До речі, ці сторінки, як правило, погана ідея. Ви не повинні намагатися розмістити саундтрек на кожній веб-сторінці. Це просто неправильно. :)

Звук html5 відтворюватиметься, якщо його запустити в результаті дії користувача. Завантаження сторінки не враховується. Отже, вам потрібно реструктуризувати веб-програму так, щоб вона була цілою на одній сторінці. Замість посилання, яке відкриває сторінку, що відтворює звук, вам потрібно це посилання для відтворення на поточній сторінці без зміни сторінки. Це правило "взаємодії з користувачем" застосовується до методів html5, які ви можете викликати на аудіо- чи відеоелементі. Виклики повертаються без будь-якого ефекту, якщо вони запускаються автоматично при завантаженні сторінки, але вони працюють, коли їх викликають обробники подій.


1

Моє рішення - запустити реальну подію дотику в попередньому меню. Звичайно, вони не змушують вас користуватися певним інтерфейсом програвача. Для моїх цілей це добре працює. Якщо у вас немає існуючого інтерфейсу для використання, afaik ви зазнали помилок. Можливо, ви можете спробувати нахилити події чи щось інше ...


1

Якщо ви створюєте елемент 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 () здається підходящим методом для автоматичного спрацьовування звуку.


Я спробував це, але, здається, це не працює. Будь-яке оновлення? sandbox.coolaj86.info/html5-audio-tag-ios4.html
coolaj86

0

Працює з jQuery, протестовано на Ipad v.5.1.1

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

Вам потрібно додати / видалити елемент відео зі сторінки.


3
Не працює на iPad 1 iOS 5.1.1 ... хоча працює на iPod 6.0 та iPhone
morgan_il

0

Я впорався з цим, приєднавши обробник подій до всіх подій, для яких вам дозволено активувати звук до елемента 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');
            });
    });
}

0

Здається, це працює:

<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>

Подивіться це в дії тут: http://www.johncoles.co.uk/ipad/test/1.html (В архіві)

З iOS 4.2 це вже не працює. Вибачте.


@ NisseEngström Мені здається, що mp3-файл також не архівується, тому редагування посилання на архів досить спірне.
До побачення StackExchange

@FrankerZ: Є посилання у форматі mp3? Я пропустив це. Дякую.
Nisse Engström
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.