小菜AS3之路

2012.2.17
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

通过ByteArray来播放MP3

Posted on 2012-12-29 16:17  枫雨  阅读(323)  评论(0编辑  收藏  举报

在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.)

  1. package
  2. {
  3.    import flash.display.Sprite;
  4.    public class MP3Wrapper extends Sprite
  5.    {
  6.       [Embed(source="test.mp3")]
  7.       public var soundClass:Class;
  8.    }
  9. }
复制代码

这段代码我们只是嵌入进来了MP3,并且把它绑定到一个叫Sound类上。当我们把这个SWF导入到主SWF上的时候,我们可以声明这个类的实例,然后我们得到了一个包含该MP3的声音对象,这时就可以播放它了。
上面的代码就像这样创建SWF的:

  1. [69:FileAttributes] AS3: true, HasMetadata: false, UseDirectBlit: false, UseGPU: false, UseNetwork: false
  2. [09:SetBackgroundColor] Color: ffffffff
  3. [86:DefineSceneAndFrameLabelData]
  4.    Scenes:
  5.       [0] Offset: 0, Name: Scene 1
  6. [14:DefineSound] SoundID: 1, Format: 2, Rate: 44kHz, Size: 16bit, Type: stereo, Samples: 6867072
  7. [82:DoABC] Lazy: true, Length: 767
  8. [76:SymbolClass]
  9.    Symbols:
  10.       [0] TagID: 1, Name: MP3Wrapper_soundClass
  11.       [1] TagID: 0, Name: MP3Wrapper
  12. [01:ShowFrame]
  13. [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里包含的采样数量,还有采样率等:

  1. var defineSound:TagDefineSound = TagDefineSound.createWithMP3(1, mp3);

这里代码展示了在运行时创建包含MP3文件的SWF,并开始播放它: