#author("2024-07-18T13:20:55+00:00","default:yoya","yoya") TITLE:SWF Editor for PHP CENTER:''SWF Editor for PHP'' RIGHT:(c) 2008/03/09- yoya@awm.jp #contents * 公式 [#g22fb6a6] - https://github.com/yoya/swfed -- https://github.com/yoya/swfed/wiki/ --- https://github.com/yoya/swfed/wiki/ChangeLog // - http://sourceforge.jp/projects/swfed - (元) https://ja.osdn.net/projects/swfed -- https://ja.osdn.net/projects/swfed/wiki/ * メモ [#memo] - http://www.adobe.com/devnet/swf/ 公式 SWF仕様書 - http://www.m2osw.com/swf_alexref.html 非公式 SWF 解析結果 ** リリース予定と変更履歴 [#changelog] - http://sourceforge.jp/projects/swfed/wiki/ChangeLog ** 課題 [#w7228897] - configure で gif, png 取りこめない場合の警告を分かり易くする - 安定化 (php binding の見直し含め) - 高速化 (はしょれる処理がありそう) - コード整理 (冗長になってる) ** 確認予定 [#fb7b8c5a] - getPNGData メソッドで透明度付きPNG の動作が未確認。tRNS は対応済みだが RGBA 形式の処理は未確認。 - replaceJPEGData で alpha データを指定した時の挙動があやしい。(JPEG は premultiplied されてないとダメかも) - getPNGData で抽出した画像のガンマ値が高いように見える。(オリジナルより白っぽい) ** 完了 [#done] - 諸々高速化 (chara.swf の dump が web越しだと重たい原因が不明) -- 一時ファイルを置くディスクが壊れてました。マシン入れ替えで対処。_(┐「ε:)_ * 成果物 [#output] ** ダウンロード [#download] - %% http://sourceforge.jp/projects/swfed/files/ release %% - %% http://svn.sourceforge.jp/svnroot/swfed/trunk/ current %% - http://sourceforge.jp/projects/swfed/scm/git/swfed/ - 利用に制限はかけません。改造して使うのもお好きなままに。 - コピーライトの名前だけ書き換えて配布されたら泣きます。(;ω;) ** 動作環境 [#runtime-env] - PHP5 (5.1.x, 5.2.x, 5.3.x, 5.4.x, 5.5.x) - Linux, FreeBSD, Macintosh(x86, PPC 両方), [http://d.hatena.ne.jp/yoya/20110810/swfed Windows(?)] - zlib, libpng, giflib ライブラリ ** 実験ページ [#testpage] - http://app.awm.jp/swfed/ ([http://svn.sourceforge.jp/svnroot/swfed/trunk/www/ ソースコード]) - http://awm.jp/~yoya/php/flash/swfdump.php ** インストール方法 [#install] - zlib, libpng, giflib が必要です。(見つからないと configure でエラーになります) *** モジュールのビルド [#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 -- CentOS や Debian だと /etc/php.d/ 以下に置き場所があるようです。([http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332046903 参考]] - 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 を追加すれば動く。 - 機能はこちらを参照の事 → [[swfed/functions]] (SWFEditor メソッド一覧) *** 使用例 (サンプルコード) [#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 と変数初期化) -- get_cid (image_id,sound_id 等、数値型 id の取得) -- replace_cid (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.h の 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 を取得%% // git archive --format=tar --prefix=swfed-0.XX/ HEAD | gzip -9 > swfed-0.XX.tar.gz > git archive --format=tar --prefix=swfed-1.00/ v1_00 | gzip -9 > swfed-1.00.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 - ムービークリップ入れ替え -- http://diary.awm.jp/~yoya/?20110319#201103190 * 課題 [#todo] - Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。buildconf してダメだったので何かやる事があるはず。config.m4 ? - 分解できるタグをもっと増やす。 - zend_mm_corrupted 問題の調査 ** 常に [#lifework] - メモリ管理のブラッシュアップ -- エージングに耐えられるように -- おかしな SWF を食わせてもリークしないように - swfed.c の new_buff の処理を何とかする。 ** 未定 [#kf22b7d4] - Windows 対応 (ハマり中…) - swf_tag.c の処理が冗長なので何とかする * FAQ [#faq] - こちらに幾つか移動 > [http://sourceforge.jp/projects/swfed/wiki/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]]) | ([[libjpeg]] 結局使ってない) - [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/ * ユーザ様 :) [#user] - http://www.polygonmagic.com/cedec/cedec20110908.pdf 資料中にswfedの文字を発見 :-) - 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 - http://blog.dtop.jp/~komaba/?p=185 SWFEditorを使ったswf合成でFlash作成者が気をつけること - http://d.hatena.ne.jp/okonomi/20110120/1295495603 swfedのインストール on Homebrew@Mac OS 10.6.6 - http://blog.ps-ax.info/2011/07/swfmill%E3%81%A7gif%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%882/ swfmillでGIFの置き換え(2) - http://d.hatena.ne.jp/deeeki/20110222/swf_editor_replace SWF Editor for PHP 画像置換 ** MacOSX [#c658ae8b] - https://gist.github.com/1057955/40da271924012a3cd0b9a7ecbff7e968fcee5861 install swfeditor MacSX 10.6 - [http://www.polidog.jp/2011/09/16/macbookpro%E3%81%ABswfeditor%E3%82%92%E3%81%84%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/ MacBookProにSWFEditorをいれてみた] * Perl [#nbf1368c] - p5-SWFEditor (perl 拡張) -- https://github.com/mix3/p5-SWFEditor * 関連ページ [#rel] - Flash SWF バイナリ ([[Flash/SWF]]) - PHP extension の作り方 ([[PHP/ext]])