Warum kann JavaScript keine .play()-Audiodateien auf der iPhone-Safari verwenden?
Lesezeit: 5 Minuten
Leon Overweel
Ich habe eine JavaScript-Web-App, die regelmäßig etwas Audio abspielt:
var SOUND_SUCCESS = new Audio('success.mp3');
SOUND_SUCCESS.play();
Dies funktioniert hervorragend auf Desktop-Browsern (getestet in Edge und Chrome), aber es spielt nicht auf Safari auf dem iPhone.
Ich habe mich in Stack Overflow umgesehen und einige Antworten von vor ein paar Jahren gefunden, dass es nicht möglich ist, Audio von Safari abzuspielen, es sei denn, Sie befinden sich in diesem Vollbild-Player. Ist das immer noch so?
Benutzer2415116
Um die Antwort von xingliang cai zu ergänzen, hier ist ein Codebeispiel, das ich für mich arbeiten lassen muss (unten bearbeitet, um auf iOS14 zu funktionieren, danke @AndrewL!):
const soundEffect = new Audio();
soundEffect.autoplay = true;
// onClick of first interaction on page before I need the sounds
// (This is a tiny MP3 file that is silent and extremely short - retrieved from https://bigsoundbank.com and then modified)
soundEffect.src = "data:audio/mpeg;base64,SUQzBAAAAAABEVRYWFgAAAAtAAADY29tbWVudABCaWdTb3VuZEJhbmsuY29tIC8gTGFTb25vdGhlcXVlLm9yZwBURU5DAAAAHQAAA1N3aXRjaCBQbHVzIMKpIE5DSCBTb2Z0d2FyZQBUSVQyAAAABgAAAzIyMzUAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAAAAD/80DEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQsRbAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQMSkAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
// later on when you actually want to play a sound at any point without user interaction
soundEffect.src="https://stackoverflow.com/questions/31776548/path/to/file.mp3";
Exzellent. Funktioniert auch gut in Angular.
– Verrückter Mac
17. März 2020 um 20:52 Uhr
Dies funktioniert bei mir in Safari Version 14.0.3 nicht mehr :/ Gibt den Klassiker zurück Unhandled Promise Rejection: AbortError: The operation was aborted.
– Großg
12. Mai 2021 um 8:58 Uhr
Mein Problem war, dass ich etwas wiedergeben wollte, das ich über den Browser aufgenommen hatte, aber Apple hat die Wiedergabe von im Browser aufgenommenem Material nicht implementiert – aber der angezeigte Fehler ist derselbe – siehe bugs.webkit.org/show_bug.cgi?id=85851 und github.com/muaz-khan/RecordRTC/issues/655
– Großg
20. Mai 2021 um 22:03 Uhr
Leider funktioniert diese Antwort nicht mehr für iOS 14.
– Thomas Bui
6. Juni 2021 um 1:51 Uhr
Danke, aktualisierte meine Antwort auf Ihre Lösung, @AndrewL!
– Benutzer2415116
27. September 2021 um 16:02 Uhr
Ed Stimmzettel
iOS deaktiviert die automatische Wiedergabe und erfordert stattdessen, dass die Wiedergabe als Teil einer Benutzerinteraktion initiiert wird (z. B. können Sie die Wiedergabe innerhalb eines Touchstart-Listeners starten). Es gibt eine kleine Dokumentation darüber auf Entwicklerdokumentation von Apple. Es gibt auch diesen Artikel Überwindung von iOS-HTML5-Audioeinschränkungen auf der Entwickler-Website von IBM mit Beispielen und weiteren Details.
Ich würde hinzufügen, dass man dies auch mit Iframes nicht umgehen kann. Ich habe das versucht.
– gesell
5. Juli 2016 um 13:27 Uhr
toter Link. Ach…
– Kyle Baker
17. September 2021 um 5:55 Uhr
IOS auf Mobilgeräten deaktiviert die automatische Tonwiedergabe standardmäßig. Also um dieses Problem zu umgehen. Sie könnten irgendwo auf der Seite eine Schaltfläche zum Aktivieren / Deaktivieren platzieren und mithilfe eines Audioelements einen Ton abspielen (“audioElement“), wenn der Benutzer auf die Schaltfläche switch klickt.
Danach das gleiche “audioElement” kann verwendet werden, um zukünftige Sounds abzuspielen, indem seine “Quelle“attributiere und nenne es”abspielen()“-Methode ohne weitere Benutzerinteraktion.
Ich fand den zweiten Teil dieser Antwort nützlich – Sie können ändern Audio(x).src und Ruf an play() aber Sie können kein neues Audio-Objekt und den Anruf machen play() ohne Benutzerinteraktion.
– Alexander
17. Juli 2019 um 21:37 Uhr
Atemberaubend. Vielen Dank für die Untersuchung und Lösung dieses Problems! Ein … Erstellen new Audio() auf eine Benutzerinteraktion und das Speichern und späteres Ändern des Objekts .src und anrufen .play() darauf funktionierte (in meinem Fall mit React und useRef). Prost
– Greg Sadetsky
30. Juni 2021 um 22:15 Uhr
Um die Lösung von @ user2415116 in iOS 14 zum Laufen zu bringen, habe ich Folgendes getan:
const soundEffect = new Audio();
soundEffect.autoplay = true;
// onClick of first interaction on page before I need the sounds
// (This is a tiny MP3 file that is silent and extremely short - retrieved from https://bigsoundbank.com and then modified)
soundEffect.src = "data:audio/mpeg;base64,SUQzBAAAAAABEVRYWFgAAAAtAAADY29tbWVudABCaWdTb3VuZEJhbmsuY29tIC8gTGFTb25vdGhlcXVlLm9yZwBURU5DAAAAHQAAA1N3aXRjaCBQbHVzIMKpIE5DSCBTb2Z0d2FyZQBUSVQyAAAABgAAAzIyMzUAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAAAAD/80DEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQsRbAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQMSkAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
// later on when you actually want to play a sound at any point without user interaction
soundEffect.src="https://stackoverflow.com/questions/31776548/path/to/file.mp3";
Sobald der Benutzer scrollt, wird der Ton abgespielt
Willick B
Sehr alte Frage, aber etwas, das einigen Leuten helfen könnte, in meinem Fall (natürlich ist dies möglicherweise nicht in allen Fällen möglich), hat es geholfen, alle Audiodateien für 1 Millisekunde abzuspielen und dann anzuhalten. Wenn Sie danach die Wiedergabe des Audios fortsetzen, funktioniert es ohne Probleme.
playButton.addEventListener('click', function(){
introVid.play();
audioPlayers[0].play(); //every array element is constructed using new Audio("yourlink");
audioPlayers[1].play();
audioPlayers[2].play();
audioPlayers[3].play();
window.setTimeout(function(){
audioPlayers[0].pause();
audioPlayers[1].pause();
audioPlayers[2].pause();
audioPlayers[3].pause();
},1);
})
Ismail Y.
Haha, ich habe es so überlistet.
Legen Sie die Seite ein Audio-Tag mit Autoplay (true)