2010-01-16 42 views
0

我在各种网站上的基于Flash的音频播放器的三个屏幕截图中绘制了要播放的剪辑的波形,并在播放时移动,并且还允许用户单击音频文件上的某个点并跳到那一点。如何在Flash中创建音乐播放器来创建音频文件的波形?

DJ版音乐播放器从http://www.djdownload.com

DJ Download Music Player http://img13.imageshack.us/img13/6739/djdownloadmusicplayer.png

的SoundCloud音乐播放器从http://www.soundcloud.com

SoundCloud Music Player http://img5.imageshack.us/img5/6336/soundcloudmusicplayer.png

TrackItDown音乐播放器从http://www.trackitdown.net

TrackItDown Music Player http://img697.imageshack.us/img697/7392/trackitdownmusicplayer.png

我有很少的Flash知识,但这很容易实现?我想只显示Flash文件一个MP3并绘制波形。我知道这可能对CPU非常敏感,所以会有缓存波形数据的方法,因此每次加载文件时都不会重新绘制?

回答

3

我从来没有这样做过自己但据我所知,情况如下。

如果您正在使用Flash Player 10,那么看起来您必须在声音播放时计算频谱。就像在Chris的链接中一样,您可以从声音对象中将声音数据转换为ByteArray,其中Sound.extract()(仅FP10)。然后通过ByteArray读取值并根据值在屏幕上绘制一些东西。

在FP9上,您必须在SoundChannel上播放声音,并在播放时从频道中读取左右峰。我发现对于(link

var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("your track url"); 
var channel:SoundChannel; 
var bytes:ByteArray = new ByteArray(); 

snd.load(req); 
this.addEventListener(Event.ENTER_FRAME, enterFrameEvent); 
channel = snd.play(0,3);  

function enterFrameEvent(event:Event):void { 
    SoundMixer.computeSpectrum(bytes, true,0); 
    // bytes has 512 values 0-255 leftchannel 256-512 right channel 
    for (var i:Number = 0; i < 256; i++) { 
     val = bytes.readFloat(); 
    } 
} 

此示例代码因此,在短期尝试坚持FP10,如果你能做到这一点(没有客户端限制),你应该能够采取Waveform类直出Chris的链接并使用它。它看起来像这个类还绘制了实际的波形(在提取音频数据之前),但是您可以将绘图移动到它自己的类中,或者修改代码以获得您自己的波形外观。

+0

他的例子中的那些插图不是频谱显示。 – 2010-01-18 01:22:57

+0

不,他们不是,但代码给你一个关于如何从Sound对象获取音频数据的想法。你对数据的处理取决于你。 – 2010-01-18 07:57:52

0

在你的实施例中的插图产生的方式是多还是少,如下所示:

图有多少每宽度显示器的像素的音频秒。

对于从左到右的每个像素,计算文件相应段的平均RMS幅度。

这会为您提供该像素的峰高。在一些显示器中,它被对称地渲染(即它从上到下被镜像),而在其他显示器中则呈现条形图样式。

(顺便说一下,很容易从他们的数字化制作的音乐的幅度显示,某种可能的techno看到)

相关问题