如何使用javascript在浏览器(safari)中请求音频自动播放权限

如何使用javascript在浏览器(safari)中请求音频自动播放权限,javascript,jquery,audio,safari,autoplay,Javascript,Jquery,Audio,Safari,Autoplay,我在Safari(MAC)中遇到这个错误 我正在实现一个功能,当买家向卖家发送请求时,它会触发音频警报。我可以播放静音音频,但在非静音播放时显示错误。 我想问的是,我们是否有任何方法可以要求用户允许音频播放许可,就像我们使用JavaScript请求地理位置或摄像头/麦克风访问许可一样。 任何帮助都将不胜感激 这是我的代码: window.MutedAudioPlayed = false; window.MyAudio = new Audio("https://XXXX.com/

我在Safari(MAC)中遇到这个错误

我正在实现一个功能,当买家向卖家发送请求时,它会触发音频警报。我可以播放静音音频,但在非静音播放时显示错误。 我想问的是,我们是否有任何方法可以要求用户允许音频播放许可,就像我们使用JavaScript请求地理位置或摄像头/麦克风访问许可一样。 任何帮助都将不胜感激

这是我的代码:

window.MutedAudioPlayed = false;
        window.MyAudio = new Audio("https://XXXX.com/input_sound.mp3");
        window.MyAudio.preload = 'auto';
        window.MyAudio.muted = true;
        window.MyAudio.play().then(function (event) {
            window.MutedAudioPlayed = true;
            console.log('Audio MutedAudioPlayed: ', window.MutedAudioPlayed);
        }).catch(function (error) {
            window.MutedAudioPlayed = false;
            console.log('Audio Play Error: ', error.message);
        });

        window.MyAudio.muted = false; 
        window.MyAudio.play().then(function (event) {
            console.log("Audio Play: ", event);
        }).catch(function (error) {
            console.log('Audio Play Error: ', error.message);
        });

根据我们目前的计算,您可以执行以下操作:

  • 请求用户对
    音频
    的权限(通常代表麦克风,但也适用于声音)
  • 加载声音文件并使用
    AudioBuffer
    播放,例如,请参见下文
  • const audioContext=new(window.audioContext | | window.webkitadiocontext)();
    navigator.mediaDevices
    .getUserMedia({audio:true})
    .然后(()=>{
    const source=audioContext.createBufferSource();
    source.addEventListener('end',()=>{
    source.stop();
    audioContext.close();
    });
    const request=new XMLHttpRequest();
    open('GET','/path to sound.mp3',true);
    request.responseType='arraybuffer';
    request.onload=()=>{
    audioContext.decodeAudioData(
    请求.答复,
    (缓冲区)=>{
    source.buffer=缓冲区;
    source.connect(audioContext.destination);
    source.start();
    },
    (e) =>{
    console.log('解码音频数据时出错'+e.message);
    });
    }
    request.send();
    })
    .catch(reason=>console.error(`Audio permissions denied:${reason}`));
    
    但这种方法有几个缺点:

  • 你不能在背景中播放声音
  • 如果这样做,声音将在Safari中排队,并在tab/window再次激活时播放