摘要:How to load ByteArray to Sound Class (2)
How to load ByteArray to Sound Class (1)主要是介紹我從網路上找到一篇專門處理透過 FileReference來讀取MP3的Library。
不過其實跟我面對的情形,其實大有差異的,因此在這篇內容的一開始,我重新說明一次我主要的遇到的情形:
1. 主要的原來資料已經是把MP3轉成ByteArry,並且存放於Database之中。
2. 需要能直接把ByteArry的資料讀取出來,並且交由Adobe Flex中的Sound的物件去進行MP3檔的播放。
因為這樣的需求,我把上一篇找到的Library好好地研究過了一番,大致上可以做出以下的說明:
‧ByteArraySegement:這個Class主要處理MP3Parser在建立ByteArray的資料上資料擷取作用。
‧SoundClassSwfByteCode:這個部分主要是將MP3檔轉成Swf適合播放的格式,所需要的幾個重要的參數,大部分是十六位元型式存在。
‧MP3SoundEvent:主要產生最後Flex Application或AIR Application連接起Sound播放元件的主要事件。
‧MP3Parser:剖析使用者選擇的檔案,將選擇的MP3檔轉成ByteArray,取得相關ID3之資訊與提供編寫ByteArray的方法。並且運用上方
三個Class進行資料處理的部分。因此,MP3Parser是主要在這個Library中針對ByteArray做最重要處理的部分。
‧MP3FileReferenceLoader:主要提供給Flex Application或AIR Application宣告成物件,負責處理使用者選擇所需要的MP3,並且修改原本
讀進來的檔案,轉成Sound與SWF所能看懂的多媒體格式。
這5個Class,運作方式:透過MP3FileReferenceLoader將實體的MP3檔,讀取進來後,交由MP3Parser進行將MP3檔轉成ByteArray之後,
並且取出該MP3檔的ID3、Header等,並且將ByteArray轉成Swf可以播放的檔案。在這邊,我認為Sound Class應該也是透過這個方式,
進行原始檔的轉換,才能被Sound Class讀取。
至於我自己的所需要使用方式,我將上方的一些重點 Class與Method加上整合成我自己所需要的Class。如下:
我取消了 MP3SoundEvent、MP3FileReferenceLoader這二個Class,並且將MP3Parser進行修改,增加了一些幾個Method:
1. loadFile(bytes:ByteArray):直接將從Database讀取出來的ByteArray直接透過這個method就可以進入ByteArray編寫與處理的步驟。
2. generateSound():loadFile()這個method中處理的部分,也是針對ByteArray編寫產生成Swf可以讀取的聲音格式。
3. swfCreated(ev:Event):屬於generateSound()中處理的部分,也是把編寫完的ByteArray,透過LoaderInfo Class將資料轉存入一個
自定的Class中。
4. getSound():讓Flex Appliation或AIR Application主要取得實際可以進行播放的Sound Object。
修改完的這個Class要怎麼處理呢?下方有我寫好的範例檔,並且我將整理好的整個Class與實作的Demo code放在我的SkyDrive。
如果有需要的人,可以自行下載,並且分享各位使用的心得,如果有缺少的地方,也請大家不要客氣,一起討論。感謝。
1: private var objSound:Sound;
2:
3: private function loadMP3fromDB():void
4: {
5: sqlStatement=new SQLStatement();
6: sqlStatement.addEventListener(SQLEvent.RESULT, resultMP3Handler);
7: sqlStatement.addEventListener(SQLErrorEvent.ERROR, errorHandler);
8: sqlStatement.sqlConnection=sqlConn;
9: sqlStatement.text="Select mp3 From sounds where sound_name='Don't Cry'";
10: sqlStatement.execute();
11: }
12: private function resultMP3Handler(event:SQLEvent):void
13: {
14: var objResult:SQLResult=event.currentTarget.getResult();
15: var objBA:ByteArray=new ByteArray();
16: objBA=objResult.data[0]["mp3"];
17: var objX:MP3Parser=new MP3Parser();
18: objX.addEventListener(Event.COMPLETE, play);
19: objX.loadFile(objBA);
20: }
21: private function play(event:Event):void
22: {
23: var objX:MP3Parser=event.currentTarget as MP3Parser;
24: objSound=objX.getSound();
25: objSound.play();
26: }
File Download:
References: