我有一个网络应用程序,可以在除 iOS 之外的所有平台上成功播放音频样本。
这是我的最小可重现示例,下面有其他上下文。
const AudioContext = window.AudioContext || window.webkitAudioContext;
const audioContext = new AudioContext();
async function loadAudioSample(url) {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
return audioBuffer;
}
function playSample(audioBuffer) {
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioContext.destination);
source.start(0);
}
// make sure user interacts with document first
document.addEventListener('click', async () => {
let buf = await loadAudioSample('./sample.mp3');
if (audioContext.state === 'suspended') {audioContext.resume();}
// logging comes up normal
console.log(audioContext.state, buf);
playSample(buf);
});
补充说明:
sample.mp3
通过 new Audio()
从音频元素播放 .play()
它确实有效,所以我认为文件格式不是问题。 (但我需要 Web Audio API 来实现更高的精度和同步性)。.wav
和 44.1kHz
处编码的 16 位 48kHz
文件。audioContext.state
在 mac 上立即记录“正在运行”,但在前几次按下时“暂停” iOS——但我很难确定它。 即使在 iOS 上“运行”时,也没有声音。我做错了什么?
我不敢相信我正在写这篇文章,但静音/静音开关已打开。 我检查了音量一百万次,但它显然与开关是分开的。
另一方面,有些事情我仍然不明白:YouTube等其他网站在我的测试过程中播放了音频;如何? 也许是因为这些是 HTML5
new Audio()
.play()
元素,而不是使用 Web Audio API?
在 iOS 上,webAudio(与媒体音频相对)连接到铃声设置。请参阅:https://bugs.webkit.org/show_bug.cgi?id=237322