[AS3]as3.0下声音控制有关的类介绍
我们最常用的是该对象并播放该文件、关闭声音流,以及访问有关声音的数据,如有关流中字节数和 ID3元数据的信息。可通过以下项对声音执行更精细的控制:声音源(声音的 SoundChannel或 Microphone对象)和 SoundTransform类中用于控制向计算机扬声器输出声音的属性。前4个类,现在我们对以上各类的功能及使用一一学习。
一、Sound类:
AS3.0帮助文件中对Sound类做如下说明:
Sound类允许您在应用程序中使用声音。使用 Sound类可以创建新的 Sound对象、将外部 MP3文件加载到
理解:
这段文字告诉我们,一旦我们实例化Sound对象,就是告诉程序:我要使用声音文件了,实际上是一种授权,就是Sound对象授权程序可以使用声音文件,而且声音文件的使用也得靠Sound对象自己来完成,比如加载声音文件、播放声音文件、关闭声音流等工作都是由Sound对象自己来完成的。如果还要对声音文件进行更精细的控制,就得借助于其它相关类,比如,要控制声音的左右声道和播放位置就要借助于SoundChannel类,要控制音量就得借助于SoundTransform类。
以下示例演示如何告知程序要使用声音文件并加载、播放该声音文件:
准备工作:
在同一文件夹内放放一首MP3音乐,并新建一个fla文件,fla文件的场景中拖入一个按钮实例名分别为pl_btn,选中第一帧,打开动作面板,输入以下代码:
- var url:URLRequest=new URLRequest("CuPlayer.com.mp3");
- //定义URLRequest对象,指定声音文件地址
- var mySound:Sound=new Sound();
- //定义Sound对象,告诉程序将要使用声音文件
- mySound.load(url);
- // CuPlayer.com提示 Sound对象加载声音文件
- pl_btn.addEventListener(MouseEvent.CLICK,onCLICK);
- function onCLICK(e:MouseEvent) {
- mySound.play();
- //Sound对象播放声音文件
- }
测试效果,源文件见所附文件夹内“认识Sound类”文件,至于对声音文件的更精细控制我们将在以后学习。
在 Flash Player 10和更高版本中,也可以使用此类来处理动态生成的声音。在这种情况下,Flash Player将使用您分配给 sampleData事件处理程序的函数来轮询声音数据。从用声音数据填充的 ByteArray对象检索声音的同时播放声音。可以使用 Sound.extract()从 Sound对象中提取声音数据,然后在将声音数据写回到流以进行播放之前可以对其进行操作。
示例一:(动态生成正弦声音)
新建fla文件,打动作面板,输入以下代码:
- var mySound:Sound = new Sound();
- //定义空的声音对象mySound,告知程序要使用声音文件
- mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
- //mySound对象添加SampleDataEvent侦听器CuPlayer.com
- mySound.play();
- //播放声音时播放器将继续发送SampleDataEvent事件,
//类似侦频事件,只要声音播放,就会不停的触发SampleDataEvent事件- function sineWaveGenerator(e:SampleDataEvent):void {
- for (var i:int = 0; i < 8192; i++) {
- var n:Number=Math.sin(i*180/Math.PI);
- e.data.writeFloat(n);
- }
- }
- //此函数使用writeFloat()方法写入数据n到ByteArray对象 (e.data)。
测试效果,源文件见所附文件夹内“动态生成声音”文件。
说明:以上代码中Sound对象并不包含声音数据,他只是通过SampleDataEvent.SAMPLE_DATA事件侦听sineWaveGenerator函数,而sineWaveGenerator函数生成声音数据通过BytesArray对象的writeFloat方法写入到BytesArray对象中去,然后再由Sound对象检索BytesArray对象对象中的声音数据并播放。此过程中只要声音不停止,就会持续发送SampleDataEvent事件,持续执行sineWaveGenerator函数为Sound对象提供声音数据,一旦停止声音播放,如SoundChannel.stop(),就会停止发送事件。
使用 Sound.extract()方法提取 Sound对象中的数据。可以使用(和修改)该数据,将其写入另一个 Sound对象的动态流以进行播放。例如,以下代码使用加载的 MP3文件的字节,并通过过滤函数 upOctave()进行传递:示例二(修改已知声音文件数据并播放,起到快进效果)
- var mySound:Sound = new Sound();
- //创建空的Sound类对象待注入数据用于最后播放
- var sourceSnd:Sound = new Sound();
- //创建空的Sound类对象(源对象)用于加载已有的声音文件
- var urlReq:URLRequest=new URLRequest("CuPlayer.com.mp3");
- sourceSnd.load(urlReq);
- //源对象加载声音文件“CuPlayer.com.mp3”
- sourceSnd.addEventListener(Event.COMPLETE, loaded);
- //源对象添加加载完成侦听事件
- function loaded(event:Event):void {
- mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
- //待注入数据声音对象添加SampleDataEvent侦听事件,以注入数据
- mySound.play();
- //播放声音文件并继续触发SampleDataEvent侦听事件,以不断地注入数据
- }
- function processSound(event:SampleDataEvent):void {
- var bytes:ByteArray = new ByteArray();
- //实例化ByteArray对象用以从源对象提取数据
- sourceSnd.extract(bytes, 8192);
- //ByteArray对象从源对象提取数据
- event.data.writeBytes(upOctave(bytes));
- //CuPlayer.com提示:注入数据
- }
- function upOctave(bytes:ByteArray):ByteArray {
- var returnBytes:ByteArray = new ByteArray();
- bytes.position=0;
- while (bytes.bytesAvailable > 0) {
- returnBytes.writeFloat(bytes.readFloat());
- returnBytes.writeFloat(bytes.readFloat());
- if (bytes.bytesAvailable>0) {
- bytes.position+=8;
- }
- }
- return returnBytes;
- }
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例