- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
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 解析結果
** 次回(0.20)リリースメモ [#v0_20]
- FreeBSD で Sef.fault する問題の修正
- 安定化 (php binding の見直し含め)
** 次々回(0.21)リリースメモ [#v0_21]
- ベクターデータのダンプ (DefineShape)
- 画像の位置/スケール変更
** 予定機能 [#we27ead7]
- 画像の位置/スケール変更、ベクターデータの編集 (DefineShape)
- フォントの抽出/入れ替え (DefineFont)
- ASの定数書き換え (DoAction)
** 修正予定 [#fb7b8c5a]
- 透明度付きPNGで処理できない事があるのでその修正
- 透明度付きPNGで処理できない事があるのでその修正 (tRNS は対応済み、RGB も並べて A のデータが入る事もあるらしい)
* 成果物 [#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 不具合が見つかっています。。。%%, 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
※ もし、無停止で更新する方法があれば、どなたかご教授頂けませんか。(無理な気がしてますが…)
* 目的 [#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 を追加
- 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 replaceGIFData(integer image_id, string gifdata)
return true/false;
function getSoundData(integer sound_id) // getMP3Data は廃止。
return string sounddata;
function replaceMLDData(integer sound_id, string mlddata)
return true/false;
function getEditString(string [variable_name|edit_id])
return text;
function replaceEditString(string [variable_name|edit_id],
string text)
return true/false;
※ 誤って {get|replace}EditTextString と記述していました。すみません。
※ 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 (テスト中)
- 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 getTagData(integer seqno);
return string tagdata;
function replaceTagData(integer seqno, string tag_data, [unsigned short new_id]);
return true/false;
function replaceMP3Data(integer sound_id, string mp3data,
integer samples)
return true/false;
- PHP extension API (未実装)
function getFontData($font_id) return $font_data;
function replaceFontData($font_id, $font_data)
return true/false;
function replaceShapeBitmapGeometryByImageId($image_id, $x, $y, $witdh, $height);
return true/false
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;
}
*** 使用例 (サンプルコード) [#usage]
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfdump.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfreplaceeditstring.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfcompress.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}
* 日記 [#diary]
- 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]]) リベンジ&色々進捗があったので
* ユーザ様 :) [#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]])