Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript html音频元素播放错误处理(既不结束也不显示任何错误) 程序目的和说明_Javascript_Audio_Error Handling - Fatal编程技术网

Javascript html音频元素播放错误处理(既不结束也不显示任何错误) 程序目的和说明

Javascript html音频元素播放错误处理(既不结束也不显示任何错误) 程序目的和说明,javascript,audio,error-handling,Javascript,Audio,Error Handling,我已经创建了一个javascript音频控制器,它可以在我的Windows计算机(出于测试原因)和android手机上的浏览器中完美运行。它能够 将base64编码的声音加载到“声音池” 将池中的某些声音添加到“播放列表” 按添加顺序依次播放列表中的声音 为了达到这最后一点,我必须听audio.oneded事件,以便等待下一个声音的开始,直到上一个声音播放完毕 问题描述 javascript音频控制器是移动应用程序的一部分,因此必须在移动/智能手机浏览器上运行。当我在iPhone Safar

我已经创建了一个javascript音频控制器,它可以在我的Windows计算机(出于测试原因)和android手机上的浏览器中完美运行。它能够

  • 将base64编码的声音加载到“声音池”
  • 将池中的某些声音添加到“播放列表”
  • 按添加顺序依次播放列表中的声音
为了达到这最后一点,我必须听audio.oneded事件,以便等待下一个声音的开始,直到上一个声音播放完毕

问题描述 javascript音频控制器是移动应用程序的一部分,因此必须在移动/智能手机浏览器上运行。当我在iPhone Safari中运行同一个应用程序时,会播放一些声音,但不会播放某些声音。为了解决这个问题,我添加了一个onerror事件侦听器,但没有添加ONENED处理程序,也没有添加

代码 函数log使用相同的参数调用console.log函数,还通过API将值发送到服务器,并记录在数据库表中,以便分析移动浏览器的日志条目

我知道我有两个具有相同用途的错误处理程序。没有人开枪

日志条目 为了便于比较,以下是Firefox在Andriod和Safari在iOS上生成的相关日志条目:

Android上的Firefox iPhone Safari 。。。除此之外,无论是ONENED还是其中一个错误处理程序都不会触发。此外,由于应用程序错误地假设上一个声音尚未播放完毕,因此不会播放更多的声音。(它没有开始播放。)

4只是“播放列表”中声音的编号

问题: 如何使OneError事件处理程序工作?如何进一步排除故障


非常感谢您的帮助。

发现问题: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);
         }
      });
   }