js / html5 audio:为什么在iOS Safari上没有触发canplaythrough?

时间:2018-04-12 09:21:57

标签: javascript html5 html5-audio

我使用下面的代码预加载音频文件数组(在用户与启动过程的按钮交互后)。在所有音频文件触发“canplaythrough”之后,代码继续进行:

var loaded = 0;
function loadedAudio() {
    // this will be called every time an audio file is loaded
    // we keep track of the loaded files vs the requested files
    loaded++;
    console.log(loaded + " audio files loaded!");
    if (loaded == audioFiles.length){
      // all have loaded
      main();
    }
}

function preloadsounds()
{
  $("#loader").show();
  console.log(level.config);
  audioFiles = level.config.soundfiles;

  // we start preloading all the audio files with html audio
  for (var i in audioFiles) {
      preloadAudio(audioFiles[i]);
  }

}

function preloadAudio(url)
{
  console.log("trying to preload "+ url);
  var audio = new Audio();
  // once this file loads, it will call loadedAudio()
  // the file will be kept by the browser as cache
  audio.addEventListener('canplaythrough', loadedAudio, false);

  audio.addEventListener('error', function failed(e)
  {
    console.log("COULD NOT LOAD AUDIO");
    $("#NETWORKERROR").show();
  });
  audio.src = url;
}

在Android(Chrome和Firefox)上运行良好,但是没有一个canplaythrough事件在iOs Safari上被激活(在5s上测试并且模拟X都是11.x)。所有文件都来自同一个Origin。我的日志中也没有收到任何错误消息。

我错过了什么?

(以上代码的基础我来自:https://stackoverflow.com/a/31351186/2602592

3 个答案:

答案 0 :(得分:11)

设置src后尝试调用load()方法。

function preloadAudio(url)
{
  console.log("trying to preload "+ url);
  var audio = new Audio();
  // once this file loads, it will call loadedAudio()
  // the file will be kept by the browser as cache
  audio.addEventListener('canplaythrough', loadedAudio, false);

  audio.addEventListener('error', function failed(e)
  {
    console.log("COULD NOT LOAD AUDIO");
    $("#NETWORKERROR").show();
  });
  audio.src = url;

  audio.load();  // add this line
}

答案 1 :(得分:2)

您是否检查过网络/服务器并确认Safari正在下载音频文件?

如果Safari没有下载音频(或只是加载元数据而不是整个文件),您可以尝试设置audio.preload = 'auto',然后再设置audio.src

答案 2 :(得分:0)

我看到很多声称可以使音频对象正常工作,尤其是在Safari上!

为了快速进行,我可以告诉您,您不需要太多,只需要在Safari 5和更高版本以及所有浏览器上运行所有功能即可。

  1. 如果只使用一个,则通过重新加载列表或文件中的第一个文件来强制调用槽。槽事件是一种允许用户读取文件的事件,因为它可以知道文件是否已加载并准备读取。如果您建立了一个播放器,则必须计划并让用户仅在发生穿越事件时才单击播放。

    ObjectAudio.src = file;

  2. 使用低谷来更新播放器

    ObjectAudio.addEventListener ('canplaythrough', Function, false);

  3. 使用“进度”来更新百分比缓冲条。

    ObjectAudio.addEventListener ('progress', Function, false);

  4. 使用timeupdate事件更新读取栏。

    ObjectAudio.addEventListener ('timeupdate', Function, false);

当我看到自己在做什么时,您不需要复杂的事情。


**只需担心Safari 5寡妇。为了使该对象正常工作,必须在用户上安装QuickTime,否则Safari 5将无法识别HTML 5 Audio对象。