Now, it's2020
Note that (for the below reason?) Chrome has changed their autoplay policy (see https://developers.google.com/web/updates/2017/09/autoplay-policy-changes ) so you now must either:
resume()
the audio context after some (any) user interaction with the page
- or be "highly ranked" (ie trust Chrome not to stop audio by default based on user's and world's behavior)
- or (as far as I get it) user must be on origin A then click a link to same origin A and that new page of A can autoplay things.
You can play a sound using the AudioContext
API and taking the source from any ArrayBuffer
(ie: from a XMLHttpRequest
or a File
)
window.addEventListener('load', function () {
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var source = audioCtx.createBufferSource();
var xhr = new XMLHttpRequest();
xhr.open('GET', 'audio-autoplay.wav');
xhr.responseType = 'arraybuffer';
xhr.addEventListener('load', function (r) {
audioCtx.decodeAudioData(
xhr.response,
function (buffer) {
source.buffer = buffer;
source.connect(audioCtx.destination);
source.loop = false;
});
source.start(0);
});
xhr.send();
});
Live example
Works on Chrome and Firefox both mobile and Desktop
Important notes
It's worth mentioning, IMO, that this "trick" can actually be considered as a browser bug, and might no longer work at any time if browser decide that this breaks user experience/becomes a widely-used annoyance (like ads).
It's also worth mentioning that, at least on my mobile and FF 54, the sound will still be played, even if your mobile is muted...
It's also also worth mentionning that user might set the autoplay
behavior to fit their wishes and needs either through the browser's usual options or through the more-advanced about:config
page (autoplay
behavior is set by Firefox's media.autoplay.enabled
and media.block-autoplay-until-in-foreground
preferences).
So forcing the audio autoplay
is a bad UX idea no matter how you do it.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…