javascript 错误是:Unhandled Promise Rejection: NotAllowedError: 在当前上下文中,用户代理或平台不允许请求,可能是因为用户拒绝了权限。
我的设置适用于其他浏览器、桌面和移动设备。
它的工作方式是:
first_audio_played = false;
first_audio_played = true;
(然后移除触摸监听器)if(first_audio_played) some_other_audio.play();
这样,只有第一个播放的音频需要用户直接输入。之后,所有音频都可以通过游戏内事件、时间等自由触发...
这似乎是大多数浏览器中音频的“规则”。 每个音频需要由用户输入触发的 iOS“规则”是什么?还是我还缺少其他步骤?
对于我的 javascript 游戏,声音最近在 iOS 上停止工作。他们都有readyState=4,但只有我在水龙头上播放的声音有效,其他的都不会播放。也许您可以在第一次点击时播放所有声音。但是我发现现在对我有用的解决方案是从 ajax arraybuffers 加载所有声音并使用 decodeAudioData()。然后,一旦您通过用户点击(而不是 body )播放了 1 个声音,它们就会随时播放。
这是我的工作代码,其中第二种方法位于底部。当我点击播放 sound2 时,sound1 也开始工作。
<html>
<body>
<div id=all style='font-size:160%;background:#DDD' onclick="log('clicked');playSound(myAudio)">
Sound1 should be playing every couple seconds.
<br />Tap here to play sound1.
</div>
<div id=debug style='font-size:120%;' onclick="playSound(myAudio2)">
Tap here to play the sound2.
</div>
<script>
var url = "http://curtastic.com/drum.wav"
var url2 = "http://curtastic.com/gold.wav"
var myAudio, myAudio2
if(0)
{
var playSound = function(sound)
{
log("playSound() readyState="+sound.readyState)
log("gold readyState="+myAudio2.readyState)
sound.play()
}
var loadSound = function(url, callback)
{
var audio = new Audio(url)
audio.addEventListener('canplaythrough', function()
{
log('canplaythrough');
if(callback)
callback()
}, false)
audio.load()
if(audio.readyState > 3)
{
log('audio.readyState > 3');
if(callback)
callback()
}
return audio
}
myAudio = loadSound(url, startInterval)
myAudio2 = loadSound(url2)
}
else
{
var playSound = function(sound)
{
log("playSound()")
var source = audioContext.createBufferSource()
if(source)
{
source.buffer = sound
if(!source.start)
source.start = source.noteOn
if(source.start)
{
var gain = audioContext.createGain()
source.connect(gain)
gain.connect(audioContext.destination)
source.start()
}
}
}
var loadSound = function(url, callback)
{
log("start loading sound "+url)
var ajax = new XMLHttpRequest()
ajax.open("GET", url, true)
ajax.responseType = "arraybuffer"
ajax.onload = function()
{
audioContext.decodeAudioData(
ajax.response,
function(buffer)
{
log("loaded sound "+url)
log(buffer)
callback(buffer)
},
function(error)
{
log(error)
}
)
}
ajax.send()
}
var AudioContext = window.AudioContext || window.webkitAudioContext
var audioContext = new AudioContext()
loadSound(url, function(r) {myAudio = r; startInterval()})
loadSound(url2, function(r) {myAudio2 = r})
}
function startInterval()
{
log("startInterval()")
setInterval(function()
{
playSound(myAudio)
}, 2000)
}
function log(m)
{
console.log(m)
debug.innerHTML += m+"<br />"
}
</script>
</body>
</html>
关于javascript - safari ios audio-拒绝播放错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298195/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |