15.13.读取音乐的声谱

问题
我想显示出声音的波形图(声谱)
解决办法
使用SoundMixer.computeSpectrum( )填充一个字节数组,读取这个数组得到具体数据。
讨论
访问声谱数据是ActionScript 3.0 新增的特性之一,在早期的Flash版本时期,开发者也很想获得这些数据,需要借助一些第三方工具,但是它们的实现过于复杂且效率低。现在这个功能已经内置于SoundMixer类之中,再加上新的ByteArray类,用很少的代码即可显示数据。

首先让我们看一下ByteArray这个类,它是ActionScript 3.0新增的专门用于处理二进制数据,经过优化,效率高,它位于flash.utils包中。表面上看起来和一般的数组差不多,但是它的方法处理数据比一般数组快的多。

要获得声谱数据,首先要创建一个空的ByteArray,像这样:
+展开
-ActionScript
var spectrum:ByteArray = new ByteArray( );

ByteArray再作为SoundMixer.computeSpectrum( )方法的参数,这个方法获得声音的快照并计算出左右声道的波形,每个通道取256个值,范围在-1.0到1.0。再把数据存到ByteArray中。

数据是准备好了,我们该怎么使用呢,我们需要循环遍历ByteArray 512次,调用getFloat( )方法,前面256个值代表左声道,后256为右声道。

下面的例子通过BitmapData对象和setPixel32( )方法显示两个声道的波形:
+展开
-ActionScript
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class Spectrum extends Sprite {
private var _sound:Sound;
private var _channel:SoundChannel;
private var _spectrumGraph:BitmapData;
public function Spectrum( ) {
// Create bitmap for spectrum display
_spectrumGraph = new BitmapData(256, 60,true,0x00000000);
var bitmap:Bitmap = new Bitmap(_spectrumGraph);
addChild(bitmap);
bitmap.x = 10;
bitmap.y = 10;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
_sound = new Sound(new URLRequest("song.mp3"));
_channel = _sound.play( );
}
public function onEnterFrame(event:Event):void
{
// Create the byte array and fill it with data
var spectrum:ByteArray = new ByteArray( );
SoundMixer.computeSpectrum(spectrum);
// Clear the bitmap
_spectrumGraph.fillRect(_spectrumGraph.rect,0x00000000);
// Create the left channel visualization
for(var i:int=0;i<256;i++) {
_spectrumGraph.setPixel32(i,20 + spectrum.readFloat( ) * 20, 0xffffffff);
}
// Create the right channel visualization
for(var i:int=0;i<256;i++) {
_spectrumGraph.setPixel32(i,40 + spectrum.readFloat( ) * 20,0xffffffff);
}
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(126)喜欢(0)flash/flex/fcs/AIR