龙城大大最近一直在找声音变速播放的解决方案。今天偶得一方法:使用Sound的extract方法将声音数据变为raw sound data, 然后在SampleDataEvent.SAMPLE_DATA事件中重写播放缓冲区数据。当然用FP9来播放是不行了,那上的解决方案小东研究的比较深,我对二进制的东东很晕。
查看例子(Run Demo),需要FlashPlayer10:
ChangeSpeed.swf (35.7 KB)
点击其中的File...按钮加载本地MP3音乐或者写入MP3网址再点击Load按钮, 加载后解析MP3时可能会占用大量CPU资源而"卡"一小会儿,这是正常现象,不用担心. 提供一个地址:http://bgmusic.8dou.net/jjsl/05.mp3,如果不能用可以自己找找或直接使用本地MP3歌曲.
那么怎么变速呢?其实就是改变播放的位置.释出SampleDataEvent.SAMPLE_DATA的一些代码:
- var i:int;
- var pos:int;
- var left:Number;
- var right:Number;
- i = 0;
- while (i++ < buffer)
- {
- pos = int(position);
- samplesData.position = pos * 8;
- left = samplesData.readFloat();
- right = samplesData.readFloat();
- event.data.writeFloat(left);
- event.data.writeFloat(right);
- position = position + speed;
- }
复制代码
position是播放位置, speed是播放速度, buffer值范围为2048~8192,这个区间值ADOBE文档中有说: "Provide between 2048 and 8192 samples in a SampleDataEvent object." 少于2048不出声,会认为播放结束而调用SoundComplete;大于8192会报错. 从最后一行代码中可以看出是通过改变播放的位置来达到变速播放效果.
至于从本地加载mp3则是使用了FP10的FileRenference.load()方法,得到本地MP3文件的数据, 然后通过org.audiofx.mp3类库将数据转换为含有声音数据的Sound对象.
关于代码就说这么多了,其实做到这里我也有很多不明白的地方,但我是个实用主义者,先学会使用,然后再研究.
源码下载(Download Source):
ChangeSpeedWithoutMP3.zip (496.12 KB)
注意:请使用Flash CS4 Professional打开源文件编译. 代码写得不是很成熟和规范,水平有限,见谅 :)
参考资源与资料: http://www.flexiblefactory.co.uk/flexible http://www.bytearray.org/?p=329 http://www.minimal.be/scratch/ http://www.kaourantin.net/2008/0 ... e-noise-part-3.html http://www.flashbrighton.org/wordpress/?p=9 http://www.blixtsystems.com/2008 ... nd-sampledataevent/
P.S. 播放完毕后会出现: Error: Error #2030: 遇到文件尾。 at flash.utils::ByteArray/readFloat() at com.kingnare.media::SoundSpeed/sampleDataHandler() 错误,大家自行处理一下 :)
原帖地址
http://bbs.actionscript3.cn/thread-14039-1-5.html
|