2014年11月19日 星期三

【作品】SWF2JPG轉檔器 + 轉AVI教學

本人自製的 128p小圖示
最近自製了一個可以把 SWF 轉成一系列 JPG 圖檔的 AIR應用程式──「SWF2JPG轉檔器」。如果想轉 AVI的朋友,也可以搭配「Image to avi」軟體,把這一系列的圖檔轉成 AVI。

以下是我製作的經過和心得,也包含一些技術面的討論內容,沒有興趣的人可以直接跳過這段,去後面找下載連結。


最近發現有些SWF檔案用任何轉檔軟體和線上轉檔網站,都無法成功轉成影片檔。

於是,我決定自己想辦法。既然 SWF是 Adobe Flash他們自己家的東西,那我用Flash 寫一個 AIR桌面應用程式,去載入外部的 SWF檔應該不可能失敗。於是我便開始著手實驗,實驗後也證明,該 SWF檔案可以被順利的載入進去。

但是 Flash似乎並沒有編碼輸出影片的功能,而我想即使有辦法讓 Flash做到也需要花不少時間尋找資源和研究。因此我決定往另一個更簡單的方向。把轉檔的過程分成兩個步驟:
  1. 將 SWF轉成 JPG。
  2. 然後再搭配我找到的「Image to avi」軟體,把這些圖檔轉成 AVI 影片。
※附註:有人可能會想說,其實 Flash可以輸出成 WMV檔案,WMV要轉其他檔案也很簡單,為什麼我要這麼辛苦呢?其實是因為,原始的 FLA檔案已經搞丟了,只剩 SWF。而把 SWF檔用 Flash IDE (不是 Player喔) 強迫開啟,也出現問題讀不出來。所以並沒有辦法重新輸出成 WMV。
將 SWF的影格,一格一格的轉成 JPG,我之前就曾經試過,證明是可行的。

我的作法是,使用 Loader類別把 SWF檔案載入,然後再使用 BitmapData類別的 Draw()方法,去把 Loader 當前影格的畫面擷取下來成為點陣圖。

比較麻煩的是最後一步,要把 BitmapData 編碼成 JPG 然後儲存起來。這個部份我使用了 as3corelib,這個 Library 相當方便,不只提供了 JPG 編碼器,還提供了許多很好用的小工具,包含 MD5驗證、字串、數字、日期等工具類別。

as3corelib 的 JPGEncoder類別,有一個 encode()方法,可以吃 BitmapData,吐出 ByteArray。我只要把 ByteArray交給 FileStream類別,使用 writeBytes()方法,就可以存成 JPG檔案了!

於是,經過一番奮鬥,「SWF2JPG轉檔器」就這樣誕生了。(其實Code也才150行左右而已啊...)

SWF2JPG轉檔器

這是它的長相:

現在就來把它分享給大家吧,這是「SWF2JPG轉檔器」免安裝版 (把AIR Runtime也包進去了,所以檔案稍肥一點...),載點在這裡:


因為操作很簡單,而且介面是中文的,所以我就不附說明了。

至於原始碼...等我放到 GitHub上之後再來 Open Source好了......

附錄-Image To AVI

至於可以跟它搭配使用的「Image To AVI」可以在這裡下載

因為「Image To AVI」稍微複雜一點,以下順便附上簡單的使用教學:
  • 第一步:按圖中框起來的按鈕,就可以把 JPG圖檔載入了。

  • 第二步:瀏覽到圖檔所在的資料夾,然後選擇要轉換的圖檔,如果要一次選擇資料夾中所有的圖檔,可以按 CTRL+A。選好後就按 OK,這應該不用教吧?


  • 第三步:在轉成影片前先做一些設定。橘色框處,是設定輸出檔案的路徑,也就是影片檔要儲存的位置和名稱。
  • 接著就是設定 FPS (Frames Per Second,影格速率,即每秒要播放幾格),以及畫面的寬和高。最好跟 Flash當中的設定調到一樣(如圖右),不過既然有保留原始的 FLA檔的話,直接輸出WMV就好了,不用像我這麼辛苦.....。如果FLA檔已經搞丟,那 FPS就用猜的吧,24基本上都 OK。至於尺寸,其實看 JPG檔案就知道了。
  • 最後設定完了,就直接按 Compile Images開始轉檔吧~


  • 這時又蹦出一個小視窗,問我們要用什麼格式來編碼,基本上如果選「全畫面(未壓縮)」的話,出來的檔案會相當大。因此建議選別的,我是選 Xvid Mpeg-4 Codec,如果出來的結果有問題,也可以換一個試試看。