SWF Editor for PHP
(c) 2008/03/09- yoya@awm.jp

メモ

次回(0.15)リリースメモ

  • 無し

目的

  • Flash SWF ファイル内のコンテンツを入れ替える
    • テキストツールで貼り付けた文字列の入れ替え
    • JPEG画像の入れ替え
    • PNG画像の入れ替えもほぼ対応 (グレー形式は未対応)
  • Adobe CS3 等で生成した SWF の必要な部分だけ PHP+swfed で書き換える事で、Flash 開発者と PHP 開発者が得意な部分に注力できます。
  • 最小限の処理で書き換えを行っているので、ming のように1からファイルを構成するより負荷が軽めです。軽くなるかもしれません。

設計

  • PHP extension (php 5.1.6, 5.2.5 で動作確認)
  • bit stream 処理は自作 (もし良いのがあったら誰か教えて…)
  • ファイル全体から tag ブロックへの分割は無条件で処理するが、tag ブロックの詳細分割は必要な時だけ行う。
  • CWF (zlib 圧縮) 対応は後回し (でも、後で対応できるように) ← 対応しました

仕様

  • php.ini の ext 設定に swfed.so を追加
  • PHP extension API (実装済)
    class SWFEditor {
         function input(string swddata) return true/false;
         function output()              return string swfdata;
         function swfInfo()             return ; // print swfInfo
         function getTagList();
                                        return array(array('tag'=>long,
                                                           'length'=>long,
                                                           'detail'=>bool),
                                                      ...)
         function getTagDetail(integer seqno);
                                        return array(...); image_id とかそれ系
          function getJpegData(integer image_id)
                                        return string jpegdata;
         function getJpegAlpha(integer image_id)
                                        return string alphadata;
         function replaceJpegData(integer image_id, string jpegdata
                                               [,string alphadata])
                                        return true/false;
         function getPNGData(integer image_id)
                                        return string pngdata;
         function replacePNGData(integer image_id, string pngdata)
                                        return true/false;
         function getSoundData(integer sound_id) // getMP3Data は廃止。
                                        return string sounddata;
         function replaceMLDData(integer sound_id, string mlddata)
                                        return true/false;
         function getEditTextString(string [variable_name|edit_id])
                                        return text;
         function replaceEditTextString(string [variable_name|edit_id],
                                        string text)
                                        return true/false;
         ※ Flash ver 6 以降は UTF-8 ですが、Flash Lite は ver 4 相当なので
          ※ CP932(SJIS-Win)エンコーディングです。アプリ側でコード変換して下さい。
          function getHeaderInfo()       return array('compress'=>...,
                                                      'version'=>...);
         function setHeaderInfo(array('compress'=>..., 'version'=>...))
                                        return true/false;
  • PHP extension API (開発中)
         function getMovieHeaderInfo()
                                  return array('frame_size'=>
                                               array('x_min' =>..,'x_max' => ..,
                                                     'y_min' =>..,'y_max' => ..);
                                               'frame_rate'=>...,
                                               'frame_count'=>...);
         function setMovieHeaderInfo(array('frame_size'=>
                                            array('x_min' =>..,'x_max' => ..,
                                                  'y_min' =>..,'y_max' => ..);
                                            'frame_rate'=>...,
                                            'frame_count'=>...);
                                        return true/false;
         function replaceMP3Data(integer sound_id, string mp3data,
                                 integer samples)
                                        return true/false;
  • PHP extension API (未実装)
         function getSymbolSWF(string symbol_name)
                                        return swfdata;
    
         function replaceSymbolSWF(string symbol_name, string swfdata)
                                        return true/false;
         function getActionData(integer seqno); // 微妙
          function disasmActionData(string actiondata);
                                        return Array(Array('op'=>$code,
                                                           'data'=>$data)
                                                     );
         function asmActiondata(Array(Array('op'=>$code, 'data'=>$data)));
                                        return action_data;
         function replaceActionData(integer seqno, string actiondata);
                                        return true/false;
         function getAlphaDataFromGIFData(string gifdata)
                                        return alphadata;
         function getTagData(integer seqno);
                                        return string tagdata;
    }

使用例 (サンプルコード)

内部仕様 (改造した人用)

  • tag ブロックの詳細データ処理
    • create (calloc と変数初期化)
    • identity (image_id,sound_id 等、数値型 id の比較)
    • destropy (メンバーを辿って全部 free)
    • input (データを受け取って内部構造に変換)
    • output (内部構造をデータとして(mallocしつつ)出力)
    • print (標準出力に内部データを渡す)
  • SWF 独自型の処理
    • parse (bitstream から内部構造に落とす)
    • build (内部構造を bitstream にのせる)

実装

  • なるべく swf_{object|header|tag|...}.c 側に処理を作って、swfed.c はそこへの橋渡しに徹する。
  • swf_tag_<タグ名の省略形>.[hc]
    swf_tag_info_table に swf_tag_detail_handler_t の形式で関数ポインタ群を設定
    -> {create, identity, output, print, destroy}

成果物

プログラム

実験ページ

インストール方法

モジュールのビルド

  • swfed-?.??.tar.gz をディレクトリ毎もってきて伸張
  • src 以下で phpize & configure & make
cd src
phpize
./configure
make

モジュール(新規)設置

  • modules 以下に生成される so ファイルを php の extension ディレクトリに copy
  • php.ini に extension 設定追加
    extension=swfed.so
  • apachectl graceful
su
cp modules/swfed.so <php_ext_dir>/.
vi <php_ini_dir>/php.ini
apachectl graceful

モジュール更新

  • apachectl stop
  • extension ディレクトリに so を copy
  • apachectl start
su
apachectl stop
cp modules/swfed.so <php_ext_dir>/.
apachectl start

※ もし、無停止で更新する方法があれば、どなたかご教授頂けませんか。(無理な気がしてますが…)

日記

課題

  • Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。buildconf してダメだったので何かやる事があるはず。config.m4 ?
  • 分解できるタグをもっと増やす。
  • zend_mm_corrupted 問題の調査

常に

  • メモリ管理のブラッシュアップ
    • エージングに耐えられるように
    • おかしな SWF を食わせてもリークしないように
  • swfed.c の new_buff の処理を何とかする。

絶賛対応中

  • swfdump/index.php の公開
  • GIF 吸出し対応 (Lossless or Lossless2 + format=3 only)

近日中に対応

  • Windows 対応 (ハマり中…)

未定

  • ベクタ画像の入れ替えを検討中。(携帯でビットマップを多用すると容量的にキツい)
    • ステージの SWF 上での扱いがよく分からない…
  • swf_tag.c の処理が冗長なので何とかする

FAQ

loadVariable や loadMovie でよくない?

  • それらを実行する時に通信が発生しますが、初めに送る Flash に反映されていれば、その通信がいらなくなるかなと…。そんな事気にしないと言われてたら、それまでですが。
  • あと、携帯Flashではボタンを押してイベントを発生させないと、これらで通信が出来ません。なので、開いてすぐに動的なデータを使いたい。といった場合に対応できません。

何故、ming を使わないの?

  • ming は一から SWF ファイルを生成するツールで、既存の SWF ファイルを書き換える機能はありません。
    • 動的でなくても良いデータも真面目にビット列を構築するので、ちょっと処理が勿体無いかなと。
  • ming に SWF 読み込み機能を追加するのも考えましたが、全種類のタグの parse を実装するのは手間(人的にもPC的にも)すぎますし、(parse を省く為に) tag ブロックを raw データでも保存できるようにするには、ming の基本構造に手を入れる事になるので、それは無しの方向で…

何故、swfmill を使わないの?

  • swfmill で SWF ファイルを XML に落として必要部分を書き換え、SWF ファイルに戻す事でも目的は達成出来ますが、パフォーマンスを気にする環境にその処理を入れる勇気が自分には無いです。^^;

php current に swf extension があるけど?

  • cvs の履歴を見ると2000年頃に pecl に移動したらしいのですが、pecl で検索しても見つからないし、実際に利用している例も見当たらないので、にんともかんとも…

資料

調査

参考

未参考

その他

関連ページ


Reload   Diff   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes