2010-11-02 82 views
2

我试图制作一个吉他练习网站,一个关键的功能是循环非常短的mp3文件(几秒钟长),两者之间绝对没有空隙。例如,它可以是一个长4和弦的和弦进程,我希望允许用户无缝循环播放它。如何在浏览器中以零差距循环播放mp3?

我尝试使用HTML5 <audio>标签与loop属性。谷歌浏览器在循环之间给出了一个小小的差距,但足够大到完全无法接受我的目的。我没有测试其他浏览器,但我相信它不会工作。

一种可能的解决方法是使用ffmpeg到流重复相同的音频作为一个MP3。但是,这会花费大量带宽。

至于我自己,我用厚颜无耻地循环无间隙的,可惜的Audacity没有一个网络版本。

那么,你有什么想法,我可以循环浏览器中的一个MP3与零差距?我更喜欢非Flash解决方案,但如果没有其他工作,我会使用Flash。

编辑: 谢谢你的一切建议。 Flash原来正常工作。我在http://vmlucid.lcm.hk/~netvope/audio/flash.html做了一个玩具演示。令我惊讶的是(我用Flash将资源和浏览器崩溃联系起来),Flash和ActionScript的设计非常好,而且易于使用。我花了只有3个小时对我的第一个Flash项目:)

回答

1

in flash AS3您可以使用computeSpectrum()提取声音数据,并在需要时将其提供给您的Sound对象(激活SampleDataEvent)。

+0

谢谢!我也会从extract()中用ByteArrays来尝试SampleDataEvents。 – netvope 2010-11-05 06:31:12

3

看一看this page。使用谷歌浏览器7听一段时间后,我发现方法1工作得很好,而方法3提供了最好的结果,虽然这有点破解。最终,所有浏览器的工作方式都不相同,尤其是因为HTML5尚未最终确定。如果可能的话,你应该选择一个Flash版本,我认为这会给你最好的循环。

+0

不幸的是差距太大。感谢信息虽然=) – netvope 2010-11-05 06:23:05

+0

@netvope-似乎你应该使用Flash然后 – DMan 2010-11-05 14:19:03

1

我不知道如何这会工作,但如果你知道你的循环持续800毫秒 - 你可以让浏览器调用play方法在800ms每...但它仍然无法保证是十全十美。我不认为浏览器在本地能够提供可靠的音频循环。

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

有传言说在最无缝的方式也退出这个功能使用到多种音频标签和它们之间的交替的最佳途径。

1

或检查出此实用程序:http://www.compuphase.com/mp3/mp3loops.htm我用它成功地为我的闪存项目时有音乐无间隙进行循环,而99%的时间,它的工作。它需要WAV作为输入。
基本上它是LAME mp3编码器的一种前端,它使用这样的设置来防止出现空白。它不会在很短的声音效果上工作(我相信不到0.5秒)。
你所要做的一切之后是使用:

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

,它会循环一千倍。

+1

该链接提供有关mp3文件中的空白的全面信息。一个必须阅读的好奇! – netvope 2010-11-05 06:26:57