传统的声音对象现在有了新助手了,这个助手就是SoundChannel,当一首曲子开始播放之后,SoundChannel就产生了,通过它可以完成一些新的功能,所以从某种意义上来说 Sound 类是用来包装 SoundChannel的,因为后者具有了很多重要的功能,并且似乎在未来也将会委以重任。
声音波谱功能也是自 flash8以来一个比较受欢迎的功能,有了这个,真得是可以做一个全功能的 mp3 播放器了。
下面的代码显示了声音波谱的功能,其效果实现的原理是利用从波谱中得到的数据,在位图中以点的形式刷出来,因为数据在不断的刷新,就会出现一个波浪线跳动的效果。
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.media.SoundMixer;
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,
0xff000000); // 以画色背景画出做图区域。
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, 0xff000000);// 有点搞不懂 .rect 是从何而来的.
// Create the left channel visualization
for(var i:int=0;i<256;i++) {
_spectrumGraph.setPixel32(i,
20 + spectrum.readFloat( ) * 20, 0xffffffff);//readFloat 函数似乎是读取一个值就自动向后移动一位,因此可以完整的读出全部的数据.
}
// Create the right channel visualization
for( i =0;i<256;i++) {
_spectrumGraph.setPixel32(i, 40 + spectrum.readFloat( ) * 20,
0xffffffff);
}
}
}
}
Sound 类本身具备加载的功能(估计是因为这个功能实在是太常用到了),利用它的加载事件,可以做出加载时的进度条,书中给出了这方面的例子,但是我的测试是不成功的,试了半天也没成功,所以就放弃了.
声音控制这一章中解决了许多经常会遇到到的问题,例如:声音的加载、音量控制、加载进度的显示、播放进度的显示,声音波谱的应用、声音的平衡控制、暂停与继续、歌曲列表的使用,在章节的最后,实现了一个“全功能”的mp3播放器,剩下的工作似乎只是界面方面的问题了。本章非常的实用,建议详读之。