[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]
Flash フォーマットの秘密
昨今人気の Flash ですが、そのファイルフォーマット(swf)は Macromedia によって
公開されていますし、サードパーティからも仕様に基づきいくつか swf ファイルを
生成する物が公開されています。と言う事はわざわざお金を払って Flash を買わなくても
プログラムでFlash ファイルが作れると言う事です。
swf の仕様を全部紹介するのも大変なので、ここでは openswf のサイトで公開されている
仕様を読むに当たって引っかかりやすい点だけをメモします。現在の仕様は大きくて
扱いにくいので、Flash4 の仕様書を基に調べました。
- http://www.openswf.org/
- http://www.macromedia.com/software/flash/open/licensing/fileformat/
- 本家 Macromedia サイト。ライセンスに同意する必要がある。
概要
ファイル全体は、ヘッダ + 本体という構成になっています。ヘッダにはファイルサイズ
等の情報が格納されています。本体はフレームとタグという単位に分割さています。
データの中身は完全なバイナリ形式で、ビット単位の情報とバイト単位の情報に分ける事が
出来ます。swf はサイズを稼ぐためビット単位の情報を多用していますが、ビット単位の情報の
後にバイト単位の情報が継続する場合、ダミーのビットで開始位置をバイト単位にそろえる必要が
あります。逆にいうとビット情報が続く場合はそろえる必要はありません(ここでハマリました)。
座標を表すためには TWIP という単位を使います。1 TWIP は 1/1440 インチだそうですが、
1/20 ピクセルと考えて大丈夫です。
データ形式
基本的なデータ形式には任意の桁数のビット形式、バイト、ワード、ロング単位の整数形式、
固定小数点形式にそれぞれの符号あり、なしがあります。それらを組み合わせて色や行列などの
構造が定義されています。
バイト情報の並びはリトルエンディアンにする必要があります。これは何のためにあるのか
分からないのですが、例えば 0x12345678 (16進数) はディスク上では
78 56 34 12
のように逆順に並びます。ビット形式の場合は気にする必要なしです。
固定小数点形式とは、例えば 8.8 fixed number とある場合、整数部分に8ビット、
小数部分に8ビット分が割り当てられます。
ヘッダ
- シグネチャ "FWS"(3文字)
- バージョン番号(UI8)
- ファイルの長さ(UI32)
- フレームサイズ(RECT)
- フレームレート(UI16)
- 全体のフレーム数(UI16)
という構造になっています。
タグ
swf の情報の最小単位はタグと呼ばれます。タグにはそれぞれタグIDで種類分けされて
おり、図形を表現するタグや図形を表示したりコントロールするタグなどの種類があります。
swf のバージョンを通し一貫した形式を保っているため、過去のバージョンの Flash
プレイヤーで最新の Flash を読んでもぶっ壊れる事はありません。単に分からないタグを
読み飛ばすような仕様になっています。
また、複数のタグをまとめてフレームという単位になります。フレームは tagShowFrame タグによって
次のフレームと分割されます。
タグはタグヘッダと本体に分かれ、タグヘッダは以下の構造をしています。
- タグID(10ビット)
- 本体長(6ビット)
- 拡張本体長(UI32)
ここでややこしいのが、他のビット情報が先頭から書かれるのに対して、タグヘッダ
だけはリトルエンディアンで16ビット分読んでからタグIDと本体長に分割します。
タグの種類には大きく分けて、定義タグと操作タグがあります。図形を描画する際は、
まず定義タグで図形の形を決めて、操作タグで表示します。
シェイプ
swf のキモがこのシェイプだそうです。swf の描画情報はベクタデータと言って、
どこからどこへペンを動かすと言うような種類の情報の塊です。そのようなペンの
軌跡をコンパクトに表現するのがこのシェイプです。定義タグは複数のシェイプを
組み合わせて一つの図形を作ります。
シェイプには移動シェイプ、曲線シェイプ、直線シェイプ、終了シェイプの種類が
あります。
サンプル
4.swf
と言うような情報を基に手でシコシコ作った swf のサンプルです。
swfdump というプログラムで解析した結果と共に載せます。
$ /cygdrive/d/takasi/zip/swfdump.exe 4.swf
----- Reading the file header ----- # ヘッダ情報
FWS
File version 3
File size 81
Movie width 100
Movie height 100
Frame rate 10
Frame count 1
----- Reading movie details -----
<----- dumping frame 0 file offset 0x001d ----->
tagSetBackgroundColor RGB_HEX 000000 # 背景色をセット
tagDefineShape tagid 1 # シェイプを定義して1番タグに設定
Number of fill styles 0 # シェイプに使うペンと塗りを定義
Number of line styles 1
Line style 1 width 5 color RGB_HEX ffff0000
moveto:0:(0,0) # 最初のシェイプはペンを(0,0)に動かす
LineStyle: 1 # ペン1(赤くて幅5(1000 TWIP) に設定)
lineto:1:(500,500). # 次のシェイプはペンを直線移動
End of shape. # 終了シェイプ
tagPlaceObject2 flags 2 depth 1 tag 1 # 1番タグのシェイプを画面に置く
tagShowFrame # フレームの終わり
<----- dumping frame 1 file offset 0x004f ----->
tagEnd # ファイルの終わり
***** Finished Dumping SWF File Information *****
test.fla
Missing File (/propella/uploads/Across_Five_Aprils_-_Pawn_Shop_Promises.mp3)