Solução # 1
Minha solução aqui é criar um iframe
<iframe src="audio/source.mp3" allow="autoplay" style="display:none" id="iframeAudio">
</iframe>
e audio
também marcar para navegadores que não sejam Chrome
<audio autoplay loop id="playAudio">
<source src="audio/source.mp3">
</audio>
e no meu script
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
if (!isChrome){
$('#iframeAudio').remove()
}
else {
$('#playAudio').remove()
}
Solução # 2:
Também há outra solução alternativa para isso de acordo com @Leonard
Crie um iframe
que não reproduza nada apenas para acionar a reprodução automática no primeiro carregamento.
<iframe src="silence.mp3" allow="autoplay" id="audio" style="display: none"></iframe>
boa fonte para o arquivo mp3 silence.mp3
Em seguida, reproduza seu arquivo de áudio real com facilidade.
<audio id="player" autoplay loop>
<source src="audio/source.mp3" type="audio/mp3">
</audio>
Pessoalmente, prefiro a solução nº 2 porque é uma abordagem mais limpa por não depender tanto de JavaScript.
Atualização de agosto de 2019
Solução # 3
Como alternativa, podemos usar <embed>
Para Firefox
Parece que a reprodução automática de áudio está funcionando, então não precisamos do <embed>
elemento porque ele criará uma execução dupla de áudio.
let audioPlaying = true,
backgroundAudio, browser;
browser = navigator.userAgent.toLowerCase();
$('<audio class="audio1" src="audio.mp3" loop></audio>').prependTo('body');
if (!browser.indexOf('firefox') > -1) {
$('<embed id="background-audio" src="audio.mp3" autostart="1"></embed>').prependTo('body');
backgroundAudio = setInterval(function() {
$("#background-audio").remove();
$('<embed id="background-audio" src="audio.mp3"></embed>').prependTo('body');
}, 120000);
}
Além disso, se você tiver um evento de alternância para o áudio, certifique-se de remover o <embed>
elemento criado para o áudio.
Observação: depois de alternar, ele reiniciará do início porque o <embed>
já foi excluído e o <audio>
elemento será reproduzido normalmente agora.
$(".toggle-audio").on('click', function(event) {
audioPlaying = !audioPlaying;
$("#background-audio").remove();
clearInterval(backgroundAudio);
if (audioPlaying){
$(".audio1").play();
}
else {
$(".audio1").pause();
}
E agora certifique-se de ocultar estes elementos <audio>
e<embed>
audio, embed {
position: absolute;
z-index: -9999;
}
Nota: diplay: none
e visibility: hidden
fará com que o <embed>
elemento não funcione.