HTML5 音频和音频精灵 – 这应该很简单

由于我们本月正在举办 HTML5 音频开发者比赛,我想再次尝试一下音频。结果令人沮丧的是,我发现它相当令人沮丧。

我在很多演讲中都提出了一个建议,就是使用 CSS 精灵 的理念并将其应用于 HTML5 音频。您将获得相同的好处 - 在一个 HTTP 请求中加载一个文件而不是多个文件,避免由于文件可能无法加载而导致的失败等等。

为了测试这一点,我使用很棒的 Kraftwerk 的 Music Non Stop 编写了 以下小型演示

点击不同的按钮应该只播放音乐文件的一部分。在我的电脑上的 Firefox、Chrome 和 Opera 中,这运行良好。但是,Safari 无法预加载音频,并且当前时间设置不正确。代码非常简单,因此应该可以正常工作。

// get the audio element and the buttons container
// define a sprite object with the names and the start and end times
// of the different sounds.
var a = document.querySelector('audio'),
    buttoncontainer = document.querySelector('#buttons'),
    audiosprite = {
      'all': [ 0, 5 ],
      'boing': [ 0, 1.3 ],
      'boomtchack': [ 2, 2.5 ],
      'peng': [ 4, 5 ]
    },
    end = 0;

// when the audio data is loaded, create the buttons
// this way non-HTML5 browsers don't get any buttons
a.addEventListener('loadeddata', function(ev) {
  for (var i in audiosprite) {
    buttoncontainer.innerHTML += '';
  }
}, false);

// If the time of the file playing is updated, compare it
// to the current end time and stop playing when this one
// is reached
a.addEventListener('timeupdate', function(ev) {
  if (a.currentTime > end) {
    a.pause();
  }
},false);

// Play the current audio sprite by setting the currentTime
function play(sound) {
  if ( audiosprite[sound] ) {
    a.currentTime = audiosprite[sound][0];
    end = audiosprite[sound][1];
    a.play();
  }
}

现在,这并不是什么新鲜事,Remy Sharp 在 2010 年写过关于音频精灵的文章,并尤其对 iOS 中存在错误的支持表示遗憾(音频根本不会加载,直到您通过触摸激活它 - 这听起来非常像 Flash 在 IE 上的“点击激活”)。

其他问题包括 HTML5 音频的循环和延迟。正如 Robert O’Callahan 所报告的,通过在播放音频元素之前克隆它可以解决此问题(以及一个 令人难以置信地恼人的测试),并且此修复程序已被 用于 Gladius HTML5 游戏引擎

总而言之,HTML5 音频似乎仍然需要大量的工作,这就是为什么最近在 HTML5 旗帜下发布的许多游戏都使用 Flash 音频或根本不使用音频的原因。这令人遗憾,需要解决。

有趣的是,有一些很棒的项目您可以参与其中。例如,Soundcloud 等人开发的 Are we playing yet? 是一个浏览器音频支持测试套件。您可以在 GitHub 上编写自己的测试 并将结果报告给浏览器制造商。

jPlayer 团队有一个很棒的 HTML5 媒体事件检查器,显示您当前浏览器支持多少 HTML5 媒体事件。

如果您想确保安全,您可以使用 Scott Schiller 开发的 SoundManager 2 来获得一个 API,该 API 在可能的情况下使用 HTML5,并在浏览器不支持时回退到 Flash。它还可以为您解决一些问题。

说到 Scott Schiller,他不断地对音频状态提供很好的见解。他关于 24 种方法的文章“可能、也许、否:HTML5 音频的状态”有一个 51 分钟的视频

还可以观看 关于同一主题的较短且更新的演讲

总而言之,我想听听您对 HTML5 音频状态的看法。

  • 宣称 HTML5 是插件终结的那些公司是否掉链子了?
  • 当您询问浏览器是否可以播放某种类型的媒体时,返回 可能或也许或“” 的 API 真的明智吗?
  • 如何解决这些问题?

让我们重新开始关于 HTML5 音频的讨论,毕竟我们需要它来构建 浏览器中的消息传递 和电话功能的未来。

哦,还有一件事。当然,还有 Firefox 的 音频数据 API 以及 Webkit 提供的 Web 音频提案,但在移动设备上运行这些将是一个更大的变化。如果您想了解更多关于这些内容以及解决其差异的库的信息,Happyworm 上有一篇很棒的 概述文章

关于 Chris Heilmann

HTML5 和开放网络的布道者。让我们修复它!

更多 Chris Heilmann 的文章…


6 条评论

  1. BOSSoNe

    谢谢你的提示!
    我用它创建了一个虚拟钢琴 http://www.b1project.com/tests/virtualPiano.html,它确实起作用了 :)

    2012 年 4 月 6 日 15:57

  2. Yves Van Goethem

    Chris,感谢你提到“AreWePlayingYet?”

    关于音频精灵,我认为它将成为一个很好的测试候选对象。
    如果有人有时间为它做出贡献,请随时这样做 :)

    2012 年 4 月 11 日 07:11

  3. K

    您是否也可以使用片段来指定播放范围,或者这会导致多次下载?示例

    src=”audio.webm” // 全部

    src=”audio.webm#t=0,1.3″ // boing

    src=”audio.webm#t=2,2.5″ // boomchack

    src=”audio.webm#t=4,5″ // Peng

    2012 年 6 月 11 日 08:15

    1. Niels Gregersen

      关于

      src=”audio.webm” // 全部

      src=”audio.webm#t=0,1.3″ // boing

      src=”audio.webm#t=2,2.5″ // boomchack

      src=”audio.webm#t=4,5″ // Peng

      我认为它在 Safari 中不起作用

      2012 年 7 月 22 日 14:50

  4. Javier Franco

    嗨,
    感谢作者撰写这篇非常有用的文章。
    有一个疑问,如何设置精灵的结尾?end 在哪个对象中?
    我正在将其编码到一个库中,音频开始播放正常,但从未结束。

    在我的播放函数中,我有

    sprite.node.addEventListener(“canplaythrough”,function(){
    this.currentTime =sound.start;
    end = sound.end;
    this.play();
    },false);

    sound 包含声音的结束和开始以及精灵的 ID,因此当我找到声音和精灵时,我像这样播放。

    提前感谢

    2013 年 3 月 1 日 04:48

  5. Johnny

    那么我们如何修改它才能在 Safari 中播放?我已经阅读并重新阅读了 Remy 关于 iOS 修复的博客,但我对此很陌生,无法弄清楚该怎么做 ;(

    我已经让您的演示使用从数组中提取精灵信息的动态添加的音频标签正常工作,但正如您预测的那样,它在 Safari 中根本不起作用。有没有人可以对此进行解释,不要太深奥? ;(

    2013 年 4 月 2 日 22:00

本文的评论已关闭。