2

我正在尝试制作一个吉他练习网站,一个关键功能是循环播放非常短的 mp3 文件(几秒钟长),两者之间的间隙绝对为零。例如,它可以是一个 4 小节长的和弦进行,我想让用户无缝地循环它。

我尝试使用带有属性的 HTML5<audio>标记。loop谷歌浏览器在循环之间给出了一个小的间隙,但对于我的目的来说足够大,完全不能接受。我还没有测试过其他浏览器,但我相信它不会工作。

一种可能的解决方法是使用ffmpeg与 mp3 相同的音频流式传输重复。但是,这会消耗大量带宽。

对我自己来说,我使用 Audacity 进行无间隙循环,但不幸的是,Audacity 没有网络版本。

那么,您知道如何在浏览器中以零间隙循环播放 mp3 吗?我更喜欢非 Flash 解决方案,但如果没有其他方法,我将使用 Flash。

编辑: 感谢您的所有建议。事实证明,Flash 可以正常工作。我在http://vmlucid.lcm.hk/~netvope/audio/flash.html做了一个玩具演示。令我惊讶的是(我过去只将 Flash 与资源消耗和浏览器崩溃联系起来),Flash 和 ActionScript 设计得相当好并且易于使用。我的第一个 Flash 项目只用了 3 个小时 :)

4

4 回答 4

3

看看这个页面。使用 Google Chrome 7 听了一会儿,我发现方法 1 运行良好,而方法 3 提供了最好的结果,虽然它有点 hack。最终,所有浏览器的工作方式都不同,尤其是在 HTML5 尚未最终确定的情况下。如果可能的话,你应该选择 Flash 版本,我认为它会给你最好的循环。

于 2010-11-02T04:05:23.557 回答
1

我不确定这将如何运作,但如果你知道你的循环持续了 800 毫秒 - 你可以让浏览器每 800 毫秒调用一次 play 方法......但仍然不能保证它是完美的。我不认为浏览器在这一点上本身就能够提供可靠的音频循环。

setInterval(function(){
  document.getElementById("loop").play();
}, 800);

有传言说,最好的方法是以最无缝的方式实现这一目标,以使用多个音频标签并在它们之间交替。

于 2010-11-02T04:19:25.843 回答
1

在 Flash AS3 中,您可以使用computeSpectrum()提取声音数据,并在需要时将其提供给您的 Sound 对象(触发SampleDataEvent)。

于 2010-11-02T06:53:22.690 回答
1

或者查看这个实用程序:http ://www.compuphase.com/mp3/mp3loops.htm当音乐必须不间断地循环播放时,我成功地将它用于我的 flash 项目,并且 99% 的时间它都有效。它以 WAV 作为输入。
基本上它是一种 LAME mp3 编码器的前端,它使用这样的设置来防止出现间隙。它不适用于非常短的声音效果(我相信少于 0.5 秒)。
之后,您所要做的就是使用:

var sound:Sound = new MySoundEffect();
sound.play(0, 1000);

它会循环一千次。

于 2010-11-02T10:11:10.957 回答