Javascript html音频元素播放错误处理(既不结束也不显示任何错误) 程序目的和说明
我已经创建了一个javascript音频控制器,它可以在我的Windows计算机(出于测试原因)和android手机上的浏览器中完美运行。它能够Javascript html音频元素播放错误处理(既不结束也不显示任何错误) 程序目的和说明,javascript,audio,error-handling,Javascript,Audio,Error Handling,我已经创建了一个javascript音频控制器,它可以在我的Windows计算机(出于测试原因)和android手机上的浏览器中完美运行。它能够 将base64编码的声音加载到“声音池” 将池中的某些声音添加到“播放列表” 按添加顺序依次播放列表中的声音 为了达到这最后一点,我必须听audio.oneded事件,以便等待下一个声音的开始,直到上一个声音播放完毕 问题描述 javascript音频控制器是移动应用程序的一部分,因此必须在移动/智能手机浏览器上运行。当我在iPhone Safar
- 将base64编码的声音加载到“声音池”
- 将池中的某些声音添加到“播放列表”
- 按添加顺序依次播放列表中的声音
非常感谢您的帮助。发现问题:iOS Safari上的音频播放功能因不允许的错误而失败:“用户代理或平台在当前上下文中不允许该请求,可能是因为用户拒绝了权限。” 下面是我更新的函数,它报告了错误(并添加了一些调试): 我知道iOS Safari阻止播放未经用户interactio初始化的音频。我知道过去我有一个成功的解决方案,那就是在用户交互时加载音频文件 然而,这是一个不同的问题,这个问题在这里得到了解决:错误处理程序永远不会触发,因为play方法已经失败了
async playNwait(audio) { // plays sound and waits until it has finished
return new Promise ((resolve) => {
audio.onerror = (event) => {
log('Play Error: ' + audio.error.code);
log('Play Error: ' + audio.error.message);
log('Play Error: ' + event.currentTarget.error.code);
log('Play Error: ' + event.currentTarget.error.message);
reject('Audio failed');
};
audio.onended = (event) => {
log(' playNwait ended');
resolve('Audio ended');
};
log(' playNwait started');
log(audio.src);
audio.addEventListener("error", function(e) {
log("Playback error: " + e.currentTarget.error.code);
var prop, props='\nEvent properties are: ';
var o = e.currentTarget.error;
for (prop in o) {
props += prop+'='+o[prop]+' ';
}
log(props);
reject('Audio failed');
});
audio.play();
});
}
"Playing 4: 60_sechzig" 2021-05-28 23:40:28
" playNwait started" 2021-05-28 23:40:28
"data:audio\/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPA..." 2021-05-28 23:40:28
" playNwait ended" 2021-05-28 23:40:29
"Played 4" 2021-05-28 23:40:29
"Playing 4: 60_sechzig" 2021-05-28 22:21:13
" playNwait started" 2021-05-28 22:21:13
"data:audio\/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPA..." 2021-05-28 22:21:13
async playNwait(audio) { // plays sound an wait until it has finished
return new Promise (async (resolve, reject) => {
audio.onerror = (event) => {
log('Play Error: ' + audio.error.code);
log('Play Error: ' + audio.error.message);
log('Play Error: ' + event.currentTarget.error.code);
log('Play Error: ' + event.currentTarget.error.message);
reject('Audio failed');
};
audio.abort = (event) => {
log(' playNwait abort');
};
audio.loadstart = (event) => {
log(' playNwait loadstart');
};
audio.onplay = (event) => {
log(' playNwait playing');
};
audio.onended = (event) => {
log(' playNwait ended');
resolve('Audio ended');
};
log(' playNwait started');
log(audio.src);
audio.addEventListener("error", function(e) {
log("Playback error: " + e.currentTarget.error.code);
var prop, props='\nEvent properties are: ';
var o = e.currentTarget.error;
for (prop in o) {
props += prop+'='+o[prop]+' ';
}
log(props);
reject('Audio failed');
});
try {
await audio.play();
} catch (err) {
error ('Media play error: ' + err.name + ' - ' + err.message);
}
});
}