2010年2月24日 星期三

FlashSURF - AS3的圖像辨識


應該是有點累格了,不過是我這幾天看到的東西。
這東西發展起來的話應用範圍會很廣,跟一般的AR不一樣,雖然無法做到3D定位,但是優點是可以隨時選擇想要判斷的圖像,效能上感覺起來也不會太差,在目前flash上的AR都需要marker的情況之下,這一套markerless的技術應該可以產生另外一種玩法。

Demo影片:

Playing with flashSURF from Eugene Zatepyakin on Vimeo.

作者Blog:
http://blog.inspirit.ru/?p=343

AS3的MP3音樂編輯器!?


很久以前剛開始碰byteArray類別時,覺得很多東西可以用byteArray來玩,就曾經去找過mp3的檔案結構來看,然後寫了一個可以把mp3切來切去組來組去的類別檔。
但是後來發現雖然可以切割組合,但是卻遇到了兩個問題:
1. 無法混音,因為mp3裡的音樂資料都是被編碼過的,以AS3的效能來看,即使有codec,AS3也跑不動。
2. Sound類別無法直接讀取byteArray來播放mp3。(這邊指的byteArray是用URLStream或FileReference所讀入的mp3的byteArray,而不是FP 10之後Sound類別透過SampleDataEvent發聲的那種byteArray。)既然無法直接將mp3 的byteArray丟到Sound裡,那麼這個將mp3拆解組合的類別基本上就是一個很雞肋的東西了。
由於遇到這兩個問題,因此我很久就沒再去想起這個類別。

但是最近在查資料的時候,卻意外的發現上述第二點有解法了!這個解法是由Christopher Martin-Sperry這個人所寫的(http://www.flexiblefactory.co.uk/flexible/?p=46),他主要的原理是先在記憶體裡產生一個swf bytecode,再將mp3的資料「注射」到這個swf裡,接著用loadBytes的方式實體化swf,再用getDefinition的方式取出Sound類別,有興趣的可以自己點上面的聯結過去,那個頁面裡有他的類別可以下載,基本上如果我們如果純粹只是要將mp3的byteArray轉成Sound的話,只會用到ByteArraySegment.as、MP3Parser.as及SoundClassSwfByteCode.as這三個類別而已。
發現了這個solution之後,我這兩天就又把之前我自己搞的那個類別拿出來玩了,即使沒辦法混音,想說這樣至少還可以線上切割組合mp3之後馬上播放來聽,而且可以在mp3裡加入一些防君子不防小人的版權保護的東西,於是很手癢的就動手寫了起來。
只不過該怎麼說呢,應該說沒有每天在過年的,我遇到了另一個問題,努力了兩天之後目前無解,情況如下:
現在拆解切割組合以及播放都很ok,歸功於FP10,組好的檔還可以直接存在本機端。但是不管我怎麼修改找問題,切出來的那一塊部份,總是跟我原本想切的那一塊有一點點的時間差,曲子越長誤差越大,可以誤差到約一秒多的時間。

flash點這裡
有興趣的可以自己點過去玩玩看(需要Flash Player10),上傳一個mp3(別太大,因為我又有跑Sound.extract(),所以mp3太大的話記憶體會很耗),拉一個區塊,點「播放被選取的」聽聽看,再點「另存新檔」,再聽聽實體檔,就知道我在說什麼了。

我後來想一想,會不會是我在拆解mp3的byteArray時查找frame header時出了問題?
一般header的格式是4個bytes,以binary的來看的話其格式會是像這樣『AAAAAAAA』『AAABBCCD』 『EEEEFFGH』『IIJJKLMM』的格式,每個字母代表一個意義,而且每個frame的header不一定會一樣,我卻是偷懶直接取header的前兩個bytes來當辨識元,只要符合0xFF 0xFB的我就把它視為是header,我知道光用兩個bytes就來判斷是否是header的做法很冒險,而且運氣差一點的話有些header的第二個byte搞不好根本不是0xFB。
但如果真的是frame header出了問題,我目前說真的還沒想到要怎樣很有效率的依序找出每一個frame的header。

算了,也許這個問題我就只好先擺著了。
如果路過的有高手知道我可能犯錯的問題在哪的話,還請幫忙解答一下~~
感謝!