【问题标题】:Why can't JavaScript .play() audio files on iPhone safari?为什么 iPhone safari 上的 JavaScript .play() 音频文件不能?
【发布时间】:2015-10-24 22:13:23
【问题描述】:

我有一个 JavaScript 网络应用程序可以定期播放一些音频,如下所示:

var SOUND_SUCCESS = new Audio('success.mp3');
SOUND_SUCCESS.play();

这在桌面浏览器上效果很好(在 Edge 和 Chrome 中测试),但它不能在 iPhone 上的 Safari 上播放。

我查看了 Stack Overflow,并在几年前找到了一些答案,即除非您使用全屏播放器,否则无法从 Safari 播放音频。还是这样吗?

【问题讨论】:

    标签: javascript ios iphone audio safari


    【解决方案1】:

    iOS 禁用自动播放,而是要求作为用户交互的一部分启动播放(例如,您可以在 touchstart 侦听器中开始播放)。 Apple's developer documentation 上有一些关于此的文档。 IBM 的开发人员站点上还有这篇文章Overcoming iOS HTML5 audio limitations,其中包含示例和更多详细信息。

    【讨论】:

    • 我要补充一点,使用 iframe 也无法解决这个问题。我试过了。
    • 死链接。唉...
    【解决方案2】:

    为了补充 xingliang cai 的回复,这是我必须为我工作的代码示例(在下面编辑以在 iOS14 上工作,感谢@AndrewL!):

    const soundEffect = new Audio();
    soundEffect.autoplay = true;
    
    // onClick of first interaction on page before I need the sounds
    // (This is a tiny MP3 file that is silent and extremely short - retrieved from https://bigsoundbank.com and then modified)
    soundEffect.src = "data:audio/mpeg;base64,SUQzBAAAAAABEVRYWFgAAAAtAAADY29tbWVudABCaWdTb3VuZEJhbmsuY29tIC8gTGFTb25vdGhlcXVlLm9yZwBURU5DAAAAHQAAA1N3aXRjaCBQbHVzIMKpIE5DSCBTb2Z0d2FyZQBUSVQyAAAABgAAAzIyMzUAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAAAAD/80DEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQsRbAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQMSkAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
    
    // later on when you actually want to play a sound at any point without user interaction
    soundEffect.src = 'path/to/file.mp3';
    

    【讨论】:

    • 优秀。在 Angular 中也能很好地工作。
    • 这救了我的命。谢谢。
    • 这在 Safari 版本 14.0.3 上不再适用于我:/ 返回经典 Unhandled Promise Rejection: AbortError: The operation was aborted.
    • 不幸的是,这个答案不再适用于 iOS 14。
    • 谢谢,更新了我对您的解决方案的回答,@AndrewL!
    【解决方案3】:

    默认情况下,移动设备上的 IOS 禁用自动声音播放。所以要绕过这个问题。如果用户单击按钮开关,您可以将启用/禁用开关按钮放在页面上的某处并使用音频元素(“audioElement”)播放一些声音。

    之后,相同的“audioElement”可以通过更改其“src”属性并调用其“play()" 方法,无需任何进一步的用户交互。

    【讨论】:

    • 令人惊叹。非常感谢您调查和解决这个问题!在用户交互上创建new Audio() 并存储它,然后更改该对象的.src 并在其上调用.play()(在我的情况下使用React 和useRef)。干杯
    【解决方案4】:

    为了让@user2415116 的解决方案在 iOS 14 中运行,我这样做了:

    const soundEffect = new Audio();
    soundEffect.autoplay = true;
    
    // onClick of first interaction on page before I need the sounds
    // (This is a tiny MP3 file that is silent and extremely short - retrieved from https://bigsoundbank.com and then modified)
    soundEffect.src = "data:audio/mpeg;base64,SUQzBAAAAAABEVRYWFgAAAAtAAADY29tbWVudABCaWdTb3VuZEJhbmsuY29tIC8gTGFTb25vdGhlcXVlLm9yZwBURU5DAAAAHQAAA1N3aXRjaCBQbHVzIMKpIE5DSCBTb2Z0d2FyZQBUSVQyAAAABgAAAzIyMzUAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAAAAD/80DEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQsRbAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zQMSkAAADSAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
    
    // later on when you actually want to play a sound at any point without user interaction
    soundEffect.src = 'path/to/file.mp3';
    

    【讨论】:

      【解决方案5】:

      我用过这个:

      useEffect(() => {
        window.addEventListener('touchstart', () => {
          document.getElementById('audio').muted = false
          document.getElementById('audio').play()
        })
      })
      

      只要用户滚动,声音就会播放

      【讨论】:

        【解决方案6】:

        非常老的问题,但可能对某些人有所帮助,就我而言(当然这可能并非在所有情况下都可行),它有助于播放所有音频文件 1 毫秒,然后暂停它们。之后,如果您继续播放音频,它就可以正常工作。

           playButton.addEventListener('click', function(){
              introVid.play();
              audioPlayers[0].play(); //every array element is constructed using new Audio("yourlink");
              audioPlayers[1].play();
              audioPlayers[2].play();
              audioPlayers[3].play();
              window.setTimeout(function(){
                audioPlayers[0].pause();
                audioPlayers[1].pause();
                audioPlayers[2].pause();
                audioPlayers[3].pause();
              },1);
            })
        

        【讨论】:

          【解决方案7】:

          哈哈,我就是这样智取的。

          在页面中加入自动播放的音频标签(true)

          <audio id="beep" src={Assets.SOUND_BEEP} autoPlay />
          

          一旦安装了元素,它将播放声音。 (即使在 Safari iOS 上)

          那么看来你可以随时再次调用来播放它

          document.getElementById('beep').play();
          

          但现在你可能会说,但我不想将声音播放为自动播放。

          是的,我聪明地把 "muted" 属性放在上面,然后在播放时将其设置为 false。

          <audio id="beep" src={Assets.SOUND_BEEP} autoPlay muted />
          

          然后玩:

          document.getElementById('beep').muted = false;
          document.getElementById('beep').play();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-28
            • 2012-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-07
            • 1970-01-01
            相关资源
            最近更新 更多