在Actionscript3中,由于没有Sound.loadBytes()方法,所以无法通过ByteArray来直接播放MP3。SWF和图片文件(JPEG,GIF和PNG)可以通过Loader.loadBytes加载,并不需要太多的操作就可以使用,而原始的声音数据可以通过Sound对象的SampleDataEvent来播放。现在事情有点棘手,如果你的MP3数据在ByteArray中,如何播放它呢。as3swf库可以帮助你解决这个问题。
http://bbs.9ria.com/thread-38407-1-1.html
我们要做以下几步:
1.创建一个嵌入了MP3的SWF。
2.通过LoaderoadBytes导入SWF。
3.实例化绑定的类。
显然,最麻烦的差事是创建嵌入了MP3的SWF。刚开始,我们要创建一个嵌入了虚拟MP3的虚拟SWF,来看看里面有什么,然后再动态创建这个结构。(We’ll just start by creating a dummy SWF using a dummy MP3 to see how it has to look like, in order to recreate the structure dynamically later.)
- package
- {
- import flash.display.Sprite;
- public class MP3Wrapper extends Sprite
- {
- [Embed(source="test.mp3")]
- public var soundClass:Class;
- }
- }
这段代码我们只是嵌入进来了MP3,并且把它绑定到一个叫Sound类上。当我们把这个SWF导入到主SWF上的时候,我们可以声明这个类的实例,然后我们得到了一个包含该MP3的声音对象,这时就可以播放它了。
上面的代码就像这样创建SWF的:
- [69:FileAttributes] AS3: true, HasMetadata: false, UseDirectBlit: false, UseGPU: false, UseNetwork: false
- [09:SetBackgroundColor] Color: ffffffff
- [86:DefineSceneAndFrameLabelData]
- Scenes:
- [0] Offset: 0, Name: Scene 1
- [14:DefineSound] SoundID: 1, Format: 2, Rate: 44kHz, Size: 16bit, Type: stereo, Samples: 6867072
- [82:DoABC] Lazy: true, Length: 767
- [76:SymbolClass]
- Symbols:
- [0] TagID: 1, Name: MP3Wrapper_soundClass
- [1] TagID: 0, Name: MP3Wrapper
- [01:ShowFrame]
- [00:End]
这里面有三个有用的标签:
1.DefineSound:包含了嵌入的MP3.我们所用的MP3是44kHz,16bit,立体声,包含了6867072声音采样。它属于SWF的内部资源,ID为1.
2.DoABC:包含所有的Actionscript字节,这里是文档类和定义的声音类。
3.SymbolClass:把Actionscript类文件绑定到库资源上,在我们的例子里,文档类是MP3Wrapper,这里
最重要的,是被绑定到库资源里的ID为1的MP3Wrapper_soundClass类。
我们刚刚重用了包括DoABC和SymboClass的所有标签,留下了DefineSound标签,需要我们去动态创建。DefineSound包括了原始的声音数据(这里是MP3),这里面包含了一些标签,它们告诉Flash Player数据的规格数等,比如声音采样的数量、采样率、采样大小、是单声道还是立体声播放,还有库ID等(通常是1,因为我们只有一个库资源)
TagDefineSound的有一个非常方便的工厂方法,用来从MP3创建自己,这个方法叫做createWithMP3。这个方法自动去扫描MP3,来确定MP3里包含的采样数量,还有采样率等:
- var defineSound:TagDefineSound = TagDefineSound.createWithMP3(1, mp3);
这里代码展示了在运行时创建包含MP3文件的SWF,并开始播放它: