仅在 iOS 上没有声音(网络音频 API)

问题描述 投票:0回答:2

我有一个网络应用程序,可以在除 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 来实现更高的精度和同步性)。
  • 音频文件托管在我自己的域上,因此它不是 CORS
  • 在 iOS 16 设备、iPhone 和 iPad 上进行测试
  • 编辑:如果是编码,我还尝试了在
    .wav
    44.1kHz
    处编码的 16 位
    48kHz
    文件。
  • 编辑 2:我怀疑问题与 iOS 上的用户交互要求有关,不允许初始化音频上下文,因为
    audioContext.state
    在 mac 上立即记录“正在运行”,但在前几次按下时“暂停” iOS——但我很难确定它。 即使在 iOS 上“运行”时,也没有声音。

我做错了什么?

javascript cross-browser mobile-safari web-audio-api audiocontext
2个回答
2
投票

我不敢相信我正在写这篇文章,但静音/静音开关已打开。 我检查了音量一百万次,但它显然与开关是分开的。

另一方面,有些事情我仍然不明白:YouTube等其他网站在我的测试过程中播放了音频;如何? 也许是因为这些是 HTML5

new Audio()
.play()
元素,而不是使用 Web Audio API?


0
投票

在 iOS 上,webAudio(与媒体音频相对)连接到铃声设置。请参阅:https://bugs.webkit.org/show_bug.cgi?id=237322

© www.soinside.com 2019 - 2024. All rights reserved.