【问题标题】:iOS 15: Web Audio playback stops working in Safari after locking screen for a few minutesiOS 15:锁定屏幕几分钟后,Web 音频播放在 Safari 中停止工作
【发布时间】:2021-11-28 19:05:42
【问题描述】:

这似乎是我将 iPod Touch 升级到 iOS 15 (15.0.1) 后出现的问题。

运行下面的示例时,它在第一次加载时运行良好,可以根据需要多次播放声音。但是,如果我在 iPod Touch 上锁定屏幕,然后在几分钟后返回,声音将不再播放。为了排除故障,我在 AudioContext 实例上设置了一个状态更改侦听器,并验证了 Safari 在屏幕锁定时将状态设置回running 后将其设置为interrupted。但是,声音没有播放。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>audio-test</title>
    </head>
    <body>
        <script>

            const AudioContext = window.AudioContext || window.webkitAudioContext;
            const audioContext = new AudioContext();

            // Create AudioBuffer and fill with two seconds of white noise.
            const channels = 2;
            const frameCount = audioContext.sampleRate * 2.0;
            const audioBuffer = audioContext.createBuffer(channels, frameCount, audioContext.sampleRate);
            for (var channel = 0; channel < channels; channel++) {
                var nowBuffering = audioBuffer.getChannelData(channel);
                for (var i = 0; i < frameCount; i++) {
                    nowBuffering[i] = Math.random() * 2 - 1;
                }
            }

            const button = document.createElement('button');
            button.textContent = 'Play Audio';
            document.body.append(button);

            button.addEventListener('click', () => {
                const currentSourceNode = new AudioBufferSourceNode(audioContext, {
                    buffer: audioBuffer,
                });
                currentSourceNode.connect(audioContext.destination);
                currentSourceNode.start();
            });

        </script>
    </body>
</html>

【问题讨论】:

    标签: javascript html ios mobile-safari web-audio-api


    【解决方案1】:

    奇怪的是,如果我在指向某个 mp3 文件的 HTML 中添加了一个音频元素,而该文件甚至根本没有在代码中引用,那么锁定屏幕一段时间然后返回页面不再影响音频播放。

    更新代码:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>audio-test</title>
        </head>
        <body>
            <script>
    
                const AudioContext = window.AudioContext || window.webkitAudioContext;
                const audioContext = new AudioContext();
    
                // Create AudioBuffer and fill with two seconds of white noise.
                const channels = 2;
                const frameCount = audioContext.sampleRate * 2.0;
                const audioBuffer = audioContext.createBuffer(channels, frameCount, audioContext.sampleRate);
                for (var channel = 0; channel < channels; channel++) {
                    var nowBuffering = audioBuffer.getChannelData(channel);
                    for (var i = 0; i < frameCount; i++) {
                        nowBuffering[i] = Math.random() * 2 - 1;
                    }
                }
    
                const button = document.createElement('button');
                button.textContent = 'Play Audio';
                document.body.append(button);
    
                button.addEventListener('click', () => {
                    const currentSourceNode = new AudioBufferSourceNode(audioContext, {
                        buffer: audioBuffer,
                    });
                    currentSourceNode.connect(audioContext.destination);
                    currentSourceNode.start();
                });
    
            </script>
            <audio src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/858/outfoxing.mp3" crossorigin="anonymous"></audio>
        </body>
    </html>
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多