[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]

Flash フォーマットの秘密

昨今人気の Flash ですが、そのファイルフォーマット(swf)は Macromedia によって
公開されていますし、サードパーティからも仕様に基づきいくつか swf ファイルを
生成する物が公開されています。と言う事はわざわざお金を払って Flash を買わなくても
プログラムでFlash ファイルが作れると言う事です。

swf の仕様を全部紹介するのも大変なので、ここでは openswf のサイトで公開されている
仕様を読むに当たって引っかかりやすい点だけをメモします。現在の仕様は大きくて
扱いにくいので、Flash4 の仕様書を基に調べました。


概要

ファイル全体は、ヘッダ + 本体という構成になっています。ヘッダにはファイルサイズ
等の情報が格納されています。本体はフレームとタグという単位に分割さています。

データの中身は完全なバイナリ形式で、ビット単位の情報とバイト単位の情報に分ける事が
出来ます。swf はサイズを稼ぐためビット単位の情報を多用していますが、ビット単位の情報の
後にバイト単位の情報が継続する場合、ダミーのビットで開始位置をバイト単位にそろえる必要が
あります。逆にいうとビット情報が続く場合はそろえる必要はありません(ここでハマリました)。

座標を表すためには TWIP という単位を使います。1 TWIP は 1/1440 インチだそうですが、
1/20 ピクセルと考えて大丈夫です。

データ形式

基本的なデータ形式には任意の桁数のビット形式、バイト、ワード、ロング単位の整数形式、
固定小数点形式にそれぞれの符号あり、なしがあります。それらを組み合わせて色や行列などの
構造が定義されています。

バイト情報の並びはリトルエンディアンにする必要があります。これは何のためにあるのか
分からないのですが、例えば 0x12345678 (16進数) はディスク上では
78 56 34 12
のように逆順に並びます。ビット形式の場合は気にする必要なしです。

固定小数点形式とは、例えば 8.8 fixed number とある場合、整数部分に8ビット、
小数部分に8ビット分が割り当てられます。

ヘッダ


という構造になっています。

タグ

swf の情報の最小単位はタグと呼ばれます。タグにはそれぞれタグIDで種類分けされて
おり、図形を表現するタグや図形を表示したりコントロールするタグなどの種類があります。
swf のバージョンを通し一貫した形式を保っているため、過去のバージョンの Flash
プレイヤーで最新の Flash を読んでもぶっ壊れる事はありません。単に分からないタグを
読み飛ばすような仕様になっています。

また、複数のタグをまとめてフレームという単位になります。フレームは tagShowFrame タグによって
次のフレームと分割されます。

タグはタグヘッダと本体に分かれ、タグヘッダは以下の構造をしています。

ここでややこしいのが、他のビット情報が先頭から書かれるのに対して、タグヘッダ
だけはリトルエンディアンで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)
propella home