Parece que no puedo hacer que AudioContext en Safari 15 funcione correctamente. Cuando lo inicia, se encuentra en estado de ejecución, pero AudioContext.currentTime nunca funciona y no se reproduce nada. Todos los consejos anteriores cubren versiones anteriores de Safari en las que necesitaba llamar a resume dentro de un controlador de clics para sacarlo de un estado suspendido, pero como puede ver a continuación, se está ejecutando y llamar a resume no hace la diferencia. Este es el más ejemplo básico que se me ocurre a continuación:
https://codepen.io/thelamer123/pen/vYeLXOm
<html> <body> <button onclick="play()">Test Audio</button> <div id="output"></div> <script> async function play() { var ac = new window.AudioContext(); ac.resume(); var response = await fetch('https://file-examples-com.github.io/uploads/2017/11/file_example_MP3_700KB.mp3'); var buffer = await response.arrayBuffer(); ac.decodeAudioData(buffer, onDecoded); function onDecoded(buffer){ var bs = ac.createBufferSource(); bs.buffer = buffer; bs.loop = true; bs.connect(ac.destination); bs.start(0); } var logloop = setInterval(() => { document.getElementById('output').innerHTML = ''; document.getElementById('output').innerHTML = 'AudioContext State: ' + ac.state + '<br>Current Time: ' + ac.currentTime; }, 100); } </script> </body> </html>Así que esto fue un par de cosas, este ejemplo parece funcionar al azar dependiendo de su sistema operativo o plataforma. El consejo que le daría a cualquiera que se encuentre con esto es envolver su lógica en un clic de botón, no intente usar la captura de eventos. Inicie el contexto de audio en un nivel superior en la carga de la página y luego, cuando se presione el botón, haga esto:
await audiocontext.resume(); console.log(audiocontext);Por alguna razón, para tener compatibilidad, no solo necesita estar dentro de una función asíncrona en la que se hizo clic, sino también registrar en la consola el contexto de audio después de reanudarlo. Con Safari 15.1 parece que puede estar en un estado en el que se está "ejecutando", pero no realmente si no haces estas dos cosas.