一、类的结构
查看flash.media包,这个包是用来处理声音、视频、照相机和麦克风的。对于处理声音来说就有6各类。现在分别对他们概括一下。
Sound类【Sound 类允许您在应用程序中使用声音。 使用 Sound 类可以创建新的 Sound 对象、将外部 MP3 文件加载到该对象并播放该文件、关闭声音流,以及访问有关声音的数据,如有关流中字节数和 ID3 元数据的信息。 可通过以下项对声音执行更精细的控制:声音源(声音的 SoundChannel 或 Microphone 对象)和 SoundTransform 类中用于控制向计算机扬声器输出声音的属性。
Sound类用来加载声音别可播放声音。其载入声音有两个方式:下面是其构造函数
public function Sound(stream:URLRequest = null, context:SoundLoaderContext = null)
URLRequest :通过URL请求访问文件 new URLRequest (str:String);
SoundLoaderContext:MP3 数据保留在 Sound 对象的缓冲区中的最小毫秒数。 在开始回放以及在网络中断后继续回放之前,Sound 对象将一直等待直至至少拥有这一数量的数据为止。 默认值为 1000(1 秒)。
第一种:通过URL访问网上或者本地mp3文件,下面是访问本地一个名为1.mp3的文件,此文件要求和此项目的fla文件放到一起。
var sound:Sound=new Sound();//默认是不会加载文件的
var url:URLRequest=new URLRequest("1.mp3");
sound.load(url);
sound.play();//播放音乐 返回一个SoundChannel 类实例
第二种:通过嵌入到程序中,使用swc文件
打开cs4,文件->导入->库或者舞台。如果说声音文件导入失败,就用千千静听转化一下就可以了。导入成功后,打开库,右键属性
设置完后确定。最后就是导出swc文件了,点击发布设置,点击Flash,在“swf设置”中选中“导出swc”复选框。点击确定。
记住,生成的所以文件最后放到同一个文件夹,如果不是有可能失败。
】
SoundChannel类【SoundChannel 类控制应用程序中的声音。 Adobe ? Flash ? 应用程序中播放的每一个声音都被分配到一个声道,而且应用程序可以具有混合在一起的多个声道。 SoundChannel 类包含 stop()
方法、用于监控声道幅度(音量)的属性,以及用于对声道设置 SoundTransform 对象的属性。
例如:var soundChannel:SoundChannel=sound.play();
soundChannel.stop();//停止声音
在此类中有一个重要是属性,那就是position属性,用来保存当前音乐播放的位置。以毫秒为单位。
】
SoundTransform类【SoundTransform 类包含音量和平移的属性。 以下对象包含 soundTransform
属性,该属性的值是一个 SoundTransform 对象:Microphone、NetStream、SimpleButton、SoundChannel、SoundMixer 和 Sprite。
此类和声音音量有关,可以调节声音。它可以通过SoundChannel的soundTransform属性获得,例如下面的实例:
var soundChannel:SoundChannel=sound.play();
var soundTf:SoundTransform =soundChannel.soundTransform;
soundTf.volume=0.7;//把声音调节为70%音量
】
SoundMixer类【SoundMixer 类包含 SWF 文件中全局声音控件的静态属性和方法。 SoundMixer 类控制 SWF 中嵌入的声音流;它并不控制动态创建的 Sound 对象(即在 ActionScript 中创建的 Sound 对象)。
此类非常简单,就是可以控制所有的声音。不可以控制单个声音。包括对声音的音量和关闭所有是声音。
其还有一个重要的操作就是可以计算操作声音的频谱。什么叫频谱其实我也不知道。最重要的就是你学会了就可以做出像windows Media layer
中的声音的可视效果。
】
ID3Info类【
ID3Info 类包含反映 ID3 元数据的属性。 可以通过访问 Sound 类的 id3
属性来获取 MP3 文件的其它元数据;例如,mySound.id3.TIME
。 有关详细信息,请在 http://www.id3.org 上参阅 Sound.id3
条目和 ID3 标签定义。
理解其实很简单,就是ma3文件规范,定义一些ID3规范信息。对ID3信息编码,以后根据ID3规范解码就可以播放声音。通过这个类你可以不必知道ID3数据的形式,知道你会使用此类就可以非常简单的访问到ID3文件中描述的例如歌曲名,作者等等。
】
二,实例代码
下面的代码主要就是实现音乐播放器的基本功能,重放,播放,停止,暂停,快进和快退。
最主要的思想就是如果想调整声音,首先必须要先stop()声音。例如重放,快进和快退,都要事先停止声音。为了可以回到先前播放的位置,可以通过 SoundChannel.postion来得知。
属性值的返回:
SoundChannel=Sound.play();
SoundTransform=SoundChannel.soundTransform
要想知道声音播放的位置,可以通过Sound的play方法返回SoundChannel类来实现,要想可以调节声音大小
可以通过SoundChannel的soundTransform属性来返回SoundTransform类来实现。
下面是一个标签,用来显示按钮的标签名字:
package
{
import flash.text.TextField;
/**
* ...
* @author 戢晶晶
*/
public class ButtonLabel extends TextField{
public function ButtonLabel(label:String) {
this.textColor = 0xffffff;
text = label;
this.mouseEnabled = false;
}
}
}
下面就是主类,
package
{
import adobe.utils.ProductManager;
import flash.accessibility.AccessibilityProperties;
import flash.display.Sprite;
import flash.events.*;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundLoaderContext;
import flash.net.*;
import flash.errors.*;
import flash.text.TextField;
import flash.ui.ContextMenuBuiltInItems;
import flash.utils.Timer;
/**
* ...
* @author 戢晶晶
* 此项目用来创建一个音乐播放器,可以对声音的播放,暂停,快进和快退,重新播放和停止
*/
public class Main extends Sprite {
private var soundPosition:int;//用来记录当前音乐的位置,暂停的位置
private var start:Boolean=true//是否开始播放音乐
/*
* 分别是重放,播放,停止,快进和快退,绘制颜色分别是
* 红色 ,绿色,黑色,蓝色,其他颜色
*/
private var replaySprite:Sprite, playSprite:Sprite, stopSprite:Sprite, speedSprite:Sprite, recedeSprite:Sprite;
private const moveSpeed:int=2000;//快进和快退的移动速度
private var sound:Sound;//音乐类
private var soundC:SoundChannel;//声音的控制
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
replaySprite = new Sprite();
replaySprite.graphics.beginFill(0xff0000);
replaySprite.graphics.drawRect(0, 0, 50, 50);
replaySprite.graphics.endFill();
addChild(replaySprite);
replaySprite.addChild(new ButtonLabel("relay"));
replaySprite.name = "replaySprite";
playSprite = new Sprite();
playSprite.graphics.beginFill(0x00ff00);
playSprite.graphics.drawRect(0, 0, 50, 50);
playSprite.graphics.endFill();
addChild(playSprite);
playSprite.x = 60;
playSprite.addChild(new ButtonLabel("play"));
playSprite.name = "playSprite";
stopSprite = new Sprite();
stopSprite.graphics.beginFill(0x0);
stopSprite.graphics.drawRect(0, 0, 50, 50);
stopSprite.graphics.endFill();
addChild(stopSprite);
stopSprite.x = 120;
stopSprite.addChild(new ButtonLabel("stop"));
stopSprite.name = "stopSprite";
speedSprite = new Sprite();
speedSprite.graphics.beginFill(0x0000ff);
speedSprite.graphics.drawRect(0, 0, 50, 50);
speedSprite.graphics.endFill();
addChild(speedSprite);
speedSprite.x = 180;
speedSprite.addChild(new ButtonLabel("march"));
speedSprite.name = "speedSprite";
recedeSprite = new Sprite();
recedeSprite.graphics.beginFill(0xff8080);
recedeSprite.graphics.drawRect(0, 0, 50, 50);
recedeSprite.graphics.endFill();
recedeSprite.x = 240;
addChild(recedeSprite);
recedeSprite.addChild(new ButtonLabel("recede"));
recedeSprite.name = "recedeSprite";
//注册主场景的按钮点击监听
addEventListener(MouseEvent.CLICK,onClick);
}
private function onClick(e:MouseEvent):void {//鼠标单击事件
var sp:Sprite = (e.target as Sprite);
if (sp == playSprite) {//播放音乐
playSound(soundPosition);
}else if (sp == stopSprite) {//停止音乐
stop();
}else if (sp == replaySprite) {//重放音乐
replay();
}else if (sp == speedSprite) {//快进音乐
march();
}else if (sp == recedeSprite) {//快退音乐
recedeS();
}
}
/*
* 播放音乐
* sp Nubmer 声音播放的位置
*/
public function playSound(sp:Number=0):void {
if (sound==null) {
sound = new MySound();//创建声音对象
}
if(start){
soundC = sound.play(sp);
start = false;
}else {
if (soundC) {//如果声音控制对象存在
pause();
start = true;
}
}
}
public function pause():void {//暂停音乐
if (soundC) {
soundPosition = soundC.position;//记录暂停的位置
soundC.stop();//停止音乐
}
}
public function stop():void {//暂停声音
if (soundC) {
soundPosition = 0;
start = true;
soundC.stop();
soundC = null;
sound = null;
}
}
public function march():void {//快进
if (soundC) {
soundPosition += moveSpeed;//快进的步数
if (soundPosition > sound.length) {//超过
stop();
return;
}
soundC.stop();
start = true;
playSound(soundPosition);
}
}
public function recedeS():void {//快退
if (soundC) {
soundPosition -= moveSpeed;
if (soundPosition <= 0) {
trace("soundPosition="+soundPosition);
stop();
}
}
}
public function replay():void {
stop();
playSound();
}
}
}