読者です 読者をやめる 読者になる 読者になる

2008-05-26 追記

PCサイトであれば、ASから動的なコンテンツを比較的簡単に取得出来るので、既に色々なサイトで動的なFlashコンテンツが存在すると思います。
しかし、携帯のFlashからは、ユーザが何らかのアクション(リンクをクリックするとか)を起こさないと通信を行えない上一つのアクションに対して通信は1回のみに制限されています。
そこで、動的なFlashコンテンツを実現するためにswfmillを使って試してみました。

swfmillの使い方

下記の様に、swf => xml,xml => swfの相互変換が可能です。

# swfファイルをxmlに変換
$ swfmill swf2xml hoge.swf hoge.xml

# xmlをswfファイルに変換
$ swfmill xml2swf hoge.xml hoge.swf

xmlの解説

swfmillで生成されるxmlは、flashのバイトコードをxmlに変換したものになります。例えば、以下のような代入文は...

_root.testvar = "Hello world";

xmlでは以下の様に表現されます。

<PushData>
  <items>
    <StackString value="/:testvar"/>
  </items>
</PushData>
<PushData>
  <items>
    <StackString value="Hello world"/>
  </items>
</PushData>
<SetVariable/>

また、JPEGなどのバイナリデータは、以下の様に表現されます。

<DefineBitsJPEG2 objectID="2">
<data>
<data>
</data>
[base64エンコードされたデータ]
</data>
</DefineBitsJPEG2>

SWF内部の画像データ形式

SWF内部の画像データは、通常のJPEGファイルと違い以下のような形式で格納されています。

SOI(FFD8)
DQT(FFDB) 
DQT(FFDB)
DHT(FFC4)
DHT(FFC4)
DHT(FFC4)
DHT(FFC4)
EOI(FFD9)
SOI(FFD8)
APP0(FFE0)
SOF0(FFC0)
....
EOI(FFD9)

通常のJPEGファイルでこの画像を差し替えた場合、PCで見ると正常に表示できるのですが、携帯ブラウザで見ると画像が真っ赤になってしまいます。
色々と調べた結果、量子化テーブルは空でも問題ないようなので以下の様にSOI+EOIを付与する事で携帯でも正常に表示可能です。

SOI(FFD8)
EOI(FFD9)
SOI(FFD8)
APP0(FFE0)
....
EOI(FFD9)

続く...?