如何为 IOS 9 初始化 SoundJS

How to initialise SoundJS for IOS 9

我们使用 CreateJS 套件已有一段时间了,但刚刚意识到我们的音频无法在 IOS9 上运行。不幸的是,我们只有一台 IOS9 测试设备,运行 IOS9.2.4,但在音频播放中得到了混合结果。

我使用的粗略流程是;

如果能够在显示启动画面之前预加载所有音频,那将是有利的。最初添加启动画面是为了允许音频在移动 Safari 上播放,点击时播放空声音。这当然适用于 IOS7/8,但不适用于 9.

我在 codepen 上创建了这个测试用例,试图找出问题并尝试一些选择。

Codepen sample

HTML

<p id="status">Hello World</p>
<canvas id="canvas" width="200" height="200"></canvas>

JS

var canvas, stage, rect;

function init() {
  canvas = document.getElementById('canvas');
  canvas.style.background = "rgb(10,10,30)";
  stage = new createjs.Stage("canvas");

  createjs.Touch.enable(stage);

  rect = new createjs.Shape();
  rect.graphics.f("#f00").dr(50,75,100, 50);
  rect.on("mousedown", handleStart, null, true);
  rect.on("touchend", handleStart, null, true);
  //rect.on("click", handleStart, null, true);
  stage.addChild(rect);
  stage.update();

  $('#status').text("Touch to Start");
  createjs.Sound.initializeDefaultPlugins();
  //createjs.Sound.alternateExtensions = ["ogg"];
  createjs.Sound.registerSound("https://www.freesound.org/data/previews/66/66136_606715-lq.mp3", "ding1");

}

function handleStart(event) {
  createjs.WebAudioPlugin.playEmptySound();

  $('#status').text("Touch to Play");

  rect.graphics._fill.style = '#0f0';
  rect.removeAllEventListeners();
  rect.on('click', handlePlay);
  stage.update();
}

function handlePlay(){
  createjs.Sound.play("ding1");
  $('#status').text("Playing");
}

init();

抱歉缺少 ogg 版本,正在努力获取测试文件以加载 x 域。

有了这个,音频在 IOS9 上部分适用于我们。如果我们离开单击红色矩形(图形开始按钮)并保留约 20 秒,然后单击绿色按钮,则不会播放音频。如果我们立即点击它,音频播放正常。

我一直在审阅 this bug/thread 并尝试遵循 Grant 的建议。我收集到 SoundJS v0.6.2 现在自动尝试在插件初始化时播放适当的空声音,但是将 initializeDefaultPlugins 和 registerSounds 调用移动到 handleStart 函数中似乎没有任何区别。如果我对问题的理解正确,调用 WebAudioPlugin.playEmptySound 方法就足够了吗?

也一直在看事件绑定,尝试mousedown/touchend而不是点击,但是等待20秒的结果是一样的。事件似乎也触发了两次,但如果我能让它正常工作,我可能会更深入地研究它。

我知道针对此问题的 Mobile Safe Approach 文章,但在此级别需要命名空间意味着对我们现有内容的大量重写。有人可能会建议是否完全有必要采用这种方法?我的印象是通过在初始处理程序中正确播放一些空音频应该是可行的。

目前还不能真正完成主要项目,但如果我能得到一个工作示例,也许我会更近一步。

如有任何想法,我们将不胜感激!

自 0.6.2 更新以来,移动安全教程不再真正相关。它可能会在不久的将来更新或删除。

  • 你永远不需要 initializeDefaultPlugins(),除非你想对结果采取行动(即,在做某事之前检查 activePlugin)。此方法会在您第一次尝试注册声音时自动触发。
  • playEmptySound也不再需要了。 SoundJS 将侦听第一个文档 mousedown/click,并在后台自动执行此操作。
  • 触摸事件不直接从 EaselJS 阶段传播,而是转化为鼠标事件(touchstart=mousedown、touchmove=mousemove、touchend=pressup/click)

基于此,单击文档中的任意位置后,无论您是否收听,您都应该能够播放声音。

这并不是说没有错误,只是说您执行的步骤没有必要。我做了一些测试,它似乎适用于 iOS9。这是一个简化的 fiddle。 https://jsfiddle.net/lannymcnie/b4k19fwc/(link 更新于 2018 年 12 月 3 日)