FlashPlayer10实例 调节MP3播放速度


很久前在天地会上看到一关于播放速度控制的帖子:悬赏 集众人之力 声音变速播放
今天偶得一方法:使用Sound的extract方法将声音数据变为raw sound data,
然后在SampleDataEvent.SAMPLE_DATA事件中重写播放缓冲区数据
点击查看例子(Run Demo),需要FlashPlayer10
点击其中的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对象.
关于代码就说这么多了,其实做到这里我也有很多不明白的地方,但我是个实用主义者,先学会使用,然后再研究.
控制播放速度的类:
SoundSpeed.as
源码下载(Download Source):
ChangeSpeedWithoutMP3.zip
ChangeSpeedWithMP3.zip
注意:请使用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/05/adobe-is-making-some-noise-part-3.html

http://www.flashbrighton.org/wordpress/?p=9

http://www.blixtsystems.com/2008/07/flash-player-10-sound-api-changes-sampledata-and-sampledataevent/

P.S. 播放完毕后会出现遇见文件尾错误.
更新:修正了加载后解析时间过长的问题。去掉了直接从本地文件读取MP3的功能,如果MP3的位速较低会出现断音现像。下面上传的文件解压后,可以放入一个sound.mp3的文件,然后点击load按钮就可以加载音乐播放了。您也可以使用上面例子中的org.audiofx.mp3类库恢复原来的本地文件浏览和读取功能。
ChangeSpeedFixed.zip
更新:见http://www.kingnare.com/auzn/article.asp?id=183

4 comments to FlashPlayer10实例 调节MP3播放速度

  • 猫粮

    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;
    }
    这样写遇到文件尾是正常的,要多加一个判断,确保它在最后一个循环中有足够的数据
    [reply=auzn,2008-12-06 03:42 PM]谢谢猫粮兄弟指点 :) [/reply]

    [Reply]

  • yoko

    又是FileRenference.load()
    org.audiofx.mp3这个类库是你写的吗,一点都看不懂啊
    [reply=auzn,2008-11-12 12:28 AM]org.audiofx.mp3不是我写的
    FileRenference.load加载到内存后,对于图片类别的文件可以用Loader加载。
    [/reply]

    [Reply]

  • 水中月

    这里将是我以后经常来学习的地方.欢迎我吧[razz]
    飞了~~~~
    [reply=auzn,2008-10-29 08:47 AM]欢迎欢迎 :) [/reply]

    [Reply]

  • Y.Boy

    有意思的一个功能,先收藏了。
    [reply=auzn,2008-10-29 08:48 AM]:) 呵呵 欢迎提出不足[/reply]

    [Reply]

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">