TITLE:SWF Editor for PHP CENTER:''SWF Editor for PHP'' RIGHT:(c) 2008/03/09- yoya@awm.jp - ここの内容は、少しずつ sourgeforge に移行する予定です。 #img(http://sourceforge.jp/sflogo.php?group_id=3689&type=1&dummy=.png) -- http://sourceforge.jp/projects/swfed/ ---- #contents * メモ [#memo] - http://www.adobe.com/devnet/swf/ 公式 SWF仕様書 - http://www.m2osw.com/swf_alexref.html 非公式 SWF 解析結果 ** 過去リリース [#o6c077f0] - http://sourceforge.jp/projects/swfed/wiki/ChangeLog ** 次回(0.28)リリースメモ [#v0_28] - たまにPHP毎落ちる問題の修正。 - setActionVariables で追加する DoActionタグの位置調整 ** 次回(0.29)リリースメモ [#v0_29] - JPEG replace 時に strip (不要なセグメントを削除) - setCompressLevel (zlib 圧縮率の変更) ** 課題 [#w7228897] - FreeBSD で Seg.fault する問題の修正 (0.24, 0.25 で治ったかも) - 安定化 (php binding の見直し含め) - 高速化 (はしょれる処理がありそう) - コード整理 (冗長になってる) ** 予定機能 [#we27ead7] - フォントの抽出/入れ替え (DefineFont) ** 確認予定 [#fb7b8c5a] - getPNGData メソッドで透明度付きPNG の動作が未確認。tRNS は対応済みだが RGBA 形式の処理は未確認。 ** 完了 [#done] - 諸々高速化 (chara.swf の dump が web越しだと重たい原因が不明) -- 一時ファイルを置くディスクが壊れてたwww * 成果物 [#output] ** ダウンロード [#download] - http://sourceforge.jp/projects/swfed/files/ release - http://svn.sourceforge.jp/svnroot/swfed/trunk/ current - 利用に制限はかけません。改造して使うのもお好きなままに。 - コピーライトの名前だけ書き換えて配布されたら泣きます。(;ω;) ** 動作環境 [#runtime-env] - PHP5 (5.1.x, 5.2.x, 5.3.0) - Linux, %%FreeBSD (apache 上で連続で呼ぶと落ちます)%%, Macintosh(x86, PPC 両方) ** 実験ページ [#testpage] - http://awm.jp/~yoya/php/swfed/index.php ([http://svn.sourceforge.jp/svnroot/swfed/trunk/www/ ソースコード]) - http://awm.jp/~yoya/php/flash/swfdump.php ** インストール方法 [#install] *** モジュールのビルド [#build] - swfed-?.??.tar.gz をもってきて伸張 -- http://sourceforge.jp/projects/swfed/files/ - src 以下で phpize & configure & make cd src phpize ./configure make - linux や freebsd だと php-dev 系pkg, macintosh だと Xcode といった開発用パッケージが必要です。 *** モジュール(新規)設置 [#setting] - 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 *** モジュール更新 [#update] - apachectl stop - extension ディレクトリに so を copy - apachectl start su apachectl stop cp modules/swfed.so <php_ext_dir>/. apachectl start ※ もし、無停止で更新する方法があれば、どなたかご教授頂けませんか。(無理な気がしてますが…) *** !!! [#gb857e1e] - なぜ apache module を更新すると Segmentation fault するのか -- http://dsas.blog.klab.org/archives/50972695.html cp でなく install (rm & cp) なら大丈夫らしい。今度試してみよう。 * 目的 [#purpose] - Flash SWF ファイル内のコンテンツを入れ替える -- テキストツールで貼り付けた文字列の入れ替え -- JPEG画像の入れ替え -- PNG画像の入れ替えもほぼ対応 (グレー形式は未対応) - Adobe CS3 等で生成した SWF の必要な部分だけ PHP+swfed で書き換える事で、Flash 開発者と PHP 開発者が得意な部分に注力できます。 - 最小限の処理で書き換えを行っているので、ming のように1からファイルを構成するより負荷が%%軽めです。%%軽くなるかもしれません。 * 設計 [#design] - PHP extension (php 5.1.6, 5.2.5 で動作確認) - bit stream 処理は自作 (もし良いのがあったら誰か教えて…) - ファイル全体から tag ブロックへの分割は無条件で処理するが、tag ブロックの詳細分割は必要な時だけ行う。 - CWF (zlib 圧縮) 対応%%は後回し (でも、後で対応できるように)%% ← 対応しました- - png に対応したので libpng が必要です。%%近いうち GIF 対応するので giflib も必要になりそうです。%% 0.15 から giflib も必要になりました。 -- 0.18 から libpng や giflib がない環境でも build 出来るようにします。但し、対応する機能は disable になります。 ** 仕様 [#api] - php.ini の ext 設定に swfed.so を追加 - SWFEditor メソッド一覧 → [[swfed/functions]] *** 使用例 (サンプルコード) [#usage] - http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfdump.php - http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfreplacejpegdata.php - http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfreplaceeditstring.php - http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfcompress.php - http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfapplyshapematrix.php ** 内部仕様 (改造したい人用) [#internal-spec] - tag ブロックの詳細データ処理 (swf_tag_~.[hc]) -- create (calloc と変数初期化) -- identity (image_id,sound_id 等、数値型 id の比較) -- destropy (メンバーを辿って全部 free) -- input (データを受け取って内部構造に変換) -- output (内部構造をデータとして(mallocしつつ)出力) -- print (標準出力に内部データを渡す) - SWF 独自型の処理 (swf_~_t) -- parse (bitstream から内部構造に落とす) -- build (内部構造を bitstream にのせる) ** 実装 [#impl] - なるべく swf_{object|header|tag|...}.c 側に処理を作って、swfed.c はそこへの橋渡しに徹する。 - swf_tag_<タグ名の省略形>.[hc] swf_tag_info_table に swf_tag_detail_handler_t の形式で関数ポインタ群を設定 -> {create, identity, output, print, destroy} * リリース作業 [#release] ** version [#p484cb74] - php_swfed.c の version を書き換え ** テスト [#test] - DefineBits -- JPEG/GIF/PNG が処理できる -- JPEG|GIF,PNG で異なる形式で入れ替えが出来る。 -- GIF/PNG で BitsPerPixel 8 以外でも処理できる -- GIF/PNG で 横幅が4の倍数以外(4*n+1 か 4*n+2 が望ましい)でも処理できる。 -- 透明つき PNG の処理が出来る。 -- JPEG に透明度をつけて処理できる。 -- JPEG に RST 有りと無しの両パターンでテスト - TextEdit -- テキストが書き換えられる -- 元より大きい(and 小さい)テキストに書き換えられる。 - Web越しで動く - config.m4 -- libpng や giflib がない場合でも動く - malloc/free -- -DMALLOC_DEBUG を付けて試験 - まとめてテスト for i in `ls *.swf`; do echo $i ; php swfdump.php $i > /dev/null ; done >& swfed-shape-ng.txt ** tarball 作成 [#taball] - svn repository web から trunk.tar.gz を取得 - tar xvfz で伸長 - chown -R yoya:develop trunk - mv trunk swfed-0.?? - tar cvfz - swfed-0.?? からインストールして動作確認。 - php -i で version 確認 - リリースページでアップロード * 日記 [#diary] - SWFいじり開始 -- http://diary.awm.jp/~yoya/?20080114#200801141 - Flash SWF ファイル内 JPEG 画像入れ替えの PHP extension 完成 -- http://diary.awm.jp/~yoya/?20080331#200803311 | ([http://d.hatena.ne.jp/yoya/20080331 hatena] | [http://mp.i-revo.jp/user.php/wrckyapk/entry/7378.html i-revo mp]) - swfed replaceJpegData alpha データ対応 (画像入れ替えサンプル&heart;) -- http://diary.awm.jp/~yoya/?20080514#200805141 * 課題 [#todo] - Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。buildconf してダメだったので何かやる事があるはず。config.m4 ? - 分解できるタグをもっと増やす。 - zend_mm_corrupted 問題の調査 ** 常に [#lifework] - メモリ管理のブラッシュアップ -- エージングに耐えられるように -- おかしな SWF を食わせてもリークしないように - swfed.c の new_buff の処理を何とかする。 ** 絶賛対応中 [#doing] - ベクタ画像の入れ替え。(携帯でビットマップを多用すると容量的にキツい) -- ステージの SWF 上での扱いがよく分からない… ** 未定 [#kf22b7d4] - Windows 対応 (ハマり中…) - swf_tag.c の処理が冗長なので何とかする * FAQ [#faq] ** loadVariable や loadMovie でよくない? [#b24a20bb] - 携帯Flashではボタンを押してイベントを発生させないと、これらで通信が出来ません。なので、開いてすぐに動的なデータを使いたい。といった場合に対応できません。 - あと、初めからデータが埋まっていれば通信しなくて済みますし。(携帯は通信のコストが馬鹿にならないので) ** 何故、ming を使わないの? [#w649e16d] - ming は一から SWF ファイルを生成するツールで、既存の SWF ファイルを書き換える機能はありません。 -- 動的でなくても良いデータまで、真面目に一からビット列を構築するので、処理が勿体無いかなと。 - ming に SWF 読み込み機能を追加するのも考えましたが、全種類のタグの parse を実装するのは手間(人的にもPC的にも)すぎますし、(parse を省く為に) tag ブロックを raw データでも保存できるようにするには、ming の基本構造に手を入れる事になるので、それは無しの方向で… ** 何故、swfmill を使わないの? [#pf335b80] - swfmill で SWF ファイルを XML に落として必要部分を書き換え、SWF ファイルに戻す事でも目的は達成出来ますが、パフォーマンスを気にする環境にその処理を入れる勇気が自分には無いです。^^; ** php current に swf extension があるけど? [#l1d146af] - cvs の履歴を見ると2000年頃に pecl に移動したらしいのですが、pecl で検索しても見つからないし、実際に利用している例も見当たらないので、にんともかんとも… * 資料 [#data] ** 調査 [#study] - Flash SWF バイナリ ([[Flash/SWF]]) - PHP extension の作り方 ([[PHP/ext]]) - zlib の使い方 ([[zlib]]) - 画像ファイル処理ライブラリ ([[libpng]]) | ([[giflib]]) | ([[jpeglib]]) - [http://diary.awm.jp/~yoya/?2008021&to=200802132#200802132 FlashSWF alpha データ抽出@Yoya's diary] ** 参考 [#ref] - http://sswf.sourceforge.net/SWFalexref.html -- http://www.m2osw.com/swf_alexref.html - http://www.swftools.org/ ** 未参考 [#noref] - SWF::Parser - SWFファイルをパース -- http://perldoc.jp/docs/modules/SWF-File-0.20/Parser.pod - SWF::Builder - SWFファイル生成 -- http://d.hatena.ne.jp/sfujiwara/20070618/1182172990 - PECL swf -- http://cvs.php.net/viewvc.cgi/pecl/swf/ ** その他 [#data-etc] - http://sourceforge.jp/projects/swfed - PHPカンファレンス2008/2009LT ([[LT/swfed]]) リベンジ&色々進捗があったので - http://labs.gree.jp/blog/2010/08/631/ * ユーザ様 :) [#d954a19b] - http://black-tree.net/diary/?date=20090104 - http://mateio.blog.so-net.ne.jp/2010-03-12 - http://blog.y-110.net/log/eid140.html - http://d.hatena.ne.jp/sasezaki/20090913/p1 * 関連ページ [#rel] - Flash SWF バイナリ ([[Flash/SWF]]) - PHP extension の作り方 ([[PHP/ext]]) |