在Actionscript3中,由于没有Sound.loadBytes()方法,所以无法通过ByteArray来直接播放MP3。SWF和图片文件(JPEG,GIF和PNG)可以通过Loader.loadBytes加载,并不需要太多的操作就可以使用,而原始的声音数据可以通过Sound对象的SampleDataEvent来播放。现在事情有点棘手,如果你的MP3数据在ByteArray中,如何播放它呢。as3swf库可以帮助你解决这个问题。
我们要做以下几步:
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,并开始播放它:
- package
- {
- import flash.display.Loader;
- import flash.display.LoaderInfo;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.media.Sound;
- import flash.net.URLLoader;
- import flash.net.URLLoaderDataFormat;
- import flash.net.URLRequest;
- import flash.utils.ByteArray;
- import com.codeazur.as3swf.SWF;
- import com.codeazur.as3swf.SWFData;
- import com.codeazur.as3swf.data.SWFScene;
- import com.codeazur.as3swf.data.SWFSymbol;
- import com.codeazur.as3swf.data.consts.SoundCompression;
- import com.codeazur.as3swf.data.consts.SoundRate;
- import com.codeazur.as3swf.data.consts.SoundSize;
- import com.codeazur.as3swf.data.consts.SoundType;
- import com.codeazur.as3swf.tags.TagDefineSceneAndFrameLabelData;
- import com.codeazur.as3swf.tags.TagDefineSound;
- import com.codeazur.as3swf.tags.TagDoABC;
- import com.codeazur.as3swf.tags.TagEnd;
- import com.codeazur.as3swf.tags.TagFileAttributes;
- import com.codeazur.as3swf.tags.TagSetBackgroundColor;
- import com.codeazur.as3swf.tags.TagShowFrame;
- import com.codeazur.as3swf.tags.TagSymbolClass;
- public class MP3Player extends Sprite
- {
- public function MP3Player()
- {
- // Load the mp3 into a ByteArray
- var request:URLRequest = new URLRequest("test.mp3");
- var loader:URLLoader = new URLLoader();
- loader.dataFormat = URLLoaderDataFormat.BINARY;
- loader.addEventListener(Event.COMPLETE, completeHandler);
- loader.load(request);
- }
- protected function completeHandler(e:Event):void {
- var mp3:ByteArray = URLLoader(e.target).data as ByteArray;
- // Wrap the MP3 with a SWF
- var swf:ByteArray = createSWFFromMP3(mp3);
- // Load the SWF with Loader::loadBytes()
- var loader:Loader = new Loader();
- loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
- loader.loadBytes(swf);
- }
- protected function initHandler(e:Event):void {
- // Get the sound class definition
- var SoundClass:Class = LoaderInfo(e.currentTarget).applicationDomain.getDefinition("MP3Wrapper_soundClass") as Class;
- // Instantiate the sound class
- var sound:Sound = new SoundClass() as Sound;
- // Play the sound
- sound.play();
- }
- protected function createSWFFromMP3(mp3:ByteArray):ByteArray
- {
- // Create an empty SWF
- // Defaults to v10, 550x400px, 50fps, one frame (works fine for us)
- var swf:SWF = new SWF();
- // Add FileAttributes tag
- // Defaults: as3 true, all other flags false (works fine for us)
- swf.tags.push(new TagFileAttributes());
- // Add SetBackgroundColor tag
- // Default: white background (works fine for us)
- swf.tags.push(new TagSetBackgroundColor());
- // Add DefineSceneAndFrameLabelData tag
- // (with the only entry being "Scene 1" at offset 0)
- var defineSceneAndFrameLabelData:TagDefineSceneAndFrameLabelData = new TagDefineSceneAndFrameLabelData();
- defineSceneAndFrameLabelData.scenes.push(new SWFScene(0, "Scene 1"));
- swf.tags.push(defineSceneAndFrameLabelData);
- // Add DefineSound tag
- // The ID is 1, all other parameters are automatically
- // determined from the mp3 itself.
- swf.tags.push(TagDefineSound.createWithMP3(1, mp3));
- // Add DoABC tag
- // Contains the AS3 byte code for the document class and the
- // class definition for the embedded sound
- swf.tags.push(TagDoABC.create(abc));
- // Add SymbolClass tag
- // Specifies the document class and binds the sound class
- // definition to the embedded sound
- var symbolClass:TagSymbolClass = new TagSymbolClass();
- symbolClass.symbols.push(SWFSymbol.create(1, "MP3Wrapper_soundClass"));
- symbolClass.symbols.push(SWFSymbol.create(0, "MP3Wrapper"));
- swf.tags.push(symbolClass);
- // Add ShowFrame tag
- swf.tags.push(new TagShowFrame());
- // Add End tag
- swf.tags.push(new TagEnd());
- // Publish the SWF
- var swfData:SWFData = new SWFData();
- swf.publish(swfData);
- return swfData;
- }
- private static var abcData:Array = [
- 0x10, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x07, 0x6d, 0x78, 0x2e, 0x63, 0x6f, 0x72, 0x65,
- 0x0a, 0x49, 0x46, 0x6c, 0x65, 0x78, 0x41, 0x73, 0x73, 0x65, 0x74, 0x0a, 0x53, 0x6f, 0x75, 0x6e,
- 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x0b, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x6d, 0x65, 0x64,
- 0x69, 0x61, 0x05, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x6d, 0x78, 0x2e, 0x63, 0x6f, 0x72, 0x65,
- 0x3a, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x00, 0x15, 0x4d, 0x50, 0x33,
- 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6c, 0x61,
- 0x73, 0x73, 0x0a, 0x4d, 0x50, 0x33, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x0d, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x06, 0x53, 0x70, 0x72, 0x69,
- 0x74, 0x65, 0x0a, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x05, 0x43, 0x6c,
- 0x61, 0x73, 0x73, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61,
- 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x32, 0x30, 0x30, 0x36, 0x2f, 0x66, 0x6c,
- 0x65, 0x78, 0x2f, 0x6d, 0x78, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x07, 0x56,
- 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x06, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x07, 0x33, 0x2e,
- 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x0b, 0x6d, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
- 0x6c, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0c, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x65,
- 0x76, 0x65, 0x6e, 0x74, 0x73, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x61,
- 0x74, 0x63, 0x68, 0x65, 0x72, 0x0d, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x16, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x16, 0x01, 0x16,
- 0x04, 0x18, 0x06, 0x16, 0x07, 0x18, 0x08, 0x16, 0x0a, 0x18, 0x09, 0x08, 0x0e, 0x16, 0x14, 0x03,
- 0x01, 0x01, 0x01, 0x04, 0x14, 0x07, 0x01, 0x02, 0x07, 0x01, 0x03, 0x07, 0x02, 0x05, 0x09, 0x02,
- 0x01, 0x07, 0x04, 0x08, 0x07, 0x04, 0x09, 0x07, 0x06, 0x0b, 0x07, 0x04, 0x0c, 0x07, 0x04, 0x0d,
- 0x07, 0x08, 0x0f, 0x07, 0x04, 0x10, 0x07, 0x01, 0x12, 0x09, 0x03, 0x01, 0x07, 0x04, 0x13, 0x07,
- 0x09, 0x15, 0x09, 0x08, 0x02, 0x07, 0x06, 0x16, 0x07, 0x06, 0x17, 0x07, 0x06, 0x18, 0x0d, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x03, 0x09, 0x03, 0x01,
- 0x04, 0x05, 0x00, 0x05, 0x02, 0x09, 0x05, 0x00, 0x08, 0x00, 0x06, 0x07, 0x09, 0x07, 0x00, 0x0b,
- 0x01, 0x08, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x04, 0x01, 0x0a, 0x06, 0x01, 0x0b, 0x11, 0x01,
- 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x01, 0x0c, 0x06, 0x00, 0x00, 0x08, 0x08, 0x03, 0x01, 0x01,
- 0x04, 0x00, 0x00, 0x06, 0x01, 0x02, 0x04, 0x00, 0x01, 0x09, 0x01, 0x05, 0x04, 0x00, 0x02, 0x0c,
- 0x01, 0x06, 0x04, 0x01, 0x03, 0x0c, 0x00, 0x01, 0x01, 0x01, 0x02, 0x03, 0xd0, 0x30, 0x47, 0x00,
- 0x00, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x47, 0x00, 0x00, 0x03, 0x02, 0x01, 0x01, 0x02, 0x0a,
- 0xd0, 0x30, 0x5d, 0x04, 0x20, 0x58, 0x00, 0x68, 0x01, 0x47, 0x00, 0x00, 0x04, 0x02, 0x01, 0x05,
- 0x06, 0x09, 0xd0, 0x30, 0x5e, 0x0a, 0x2c, 0x11, 0x68, 0x0a, 0x47, 0x00, 0x00, 0x05, 0x01, 0x01,
- 0x06, 0x07, 0x06, 0xd0, 0x30, 0xd0, 0x49, 0x00, 0x47, 0x00, 0x00, 0x06, 0x02, 0x01, 0x01, 0x05,
- 0x17, 0xd0, 0x30, 0x5d, 0x0d, 0x60, 0x0e, 0x30, 0x60, 0x0f, 0x30, 0x60, 0x03, 0x30, 0x60, 0x03,
- 0x58, 0x01, 0x1d, 0x1d, 0x1d, 0x68, 0x02, 0x47, 0x00, 0x00, 0x07, 0x01, 0x01, 0x06, 0x07, 0x03,
- 0xd0, 0x30, 0x47, 0x00, 0x00, 0x08, 0x01, 0x01, 0x07, 0x08, 0x06, 0xd0, 0x30, 0xd0, 0x49, 0x00,
- 0x47, 0x00, 0x00, 0x09, 0x02, 0x01, 0x01, 0x06, 0x1b, 0xd0, 0x30, 0x5d, 0x10, 0x60, 0x0e, 0x30,
- 0x60, 0x0f, 0x30, 0x60, 0x03, 0x30, 0x60, 0x02, 0x30, 0x60, 0x02, 0x58, 0x02, 0x1d, 0x1d, 0x1d,
- 0x1d, 0x68, 0x05, 0x47, 0x00, 0x00, 0x0a, 0x01, 0x01, 0x08, 0x09, 0x03, 0xd0, 0x30, 0x47, 0x00,
- 0x00, 0x0b, 0x02, 0x01, 0x09, 0x0a, 0x0b, 0xd0, 0x30, 0xd0, 0x60, 0x05, 0x68, 0x08, 0xd0, 0x49,
- 0x00, 0x47, 0x00, 0x00, 0x0c, 0x02, 0x01, 0x01, 0x08, 0x23, 0xd0, 0x30, 0x65, 0x00, 0x60, 0x0e,
- 0x30, 0x60, 0x0f, 0x30, 0x60, 0x11, 0x30, 0x60, 0x12, 0x30, 0x60, 0x13, 0x30, 0x60, 0x07, 0x30,
- 0x60, 0x07, 0x58, 0x03, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x68, 0x06, 0x47, 0x00, 0x00
- ];
- private static function abcDataToByteArray():ByteArray {
- var ba:ByteArray = new ByteArray();
- for (var i:uint = 0; i < abcData.length; i++) {
- ba.writeByte(abcData[i]);
- }
- return ba;
- }
- private static var abc:ByteArray = abcDataToByteArray();
- }
- }