SWFEditorを用いてFlash SWFからJPEGファイルを取り出す
PHPカンファレンス2009での個人的な目玉は、ハタさんの発表とyoyaさんの発表でした。
yoyaさんの発表にあったSWF Editor for PHPをEdit以外の用途で使ってみます。
SWFEditorについては以下に記載があります。
http://pwiki.awm.jp/~yoya/?swfed
発表の際にたしか美少女が対応バージョンについて聞いてましたが、現在はPHP5.3には対応しておらず(Zend API的に*1、私のPHP 5.2.6-3ubuntu4.2ではphpizeできました。導入は上記サイトどおりで問題ないと思いますが、私の場合はsvn checkout,phpize, /etc/php5/cli/conf.d/swfed.iniの追加という手順です。
/trunk/sample/*配下にあるものでは一気にswfからjpgを取り出し保存するものがなかったようなので、それ用のコードを元のサンプルをいじって書いてみました。
<?php if ($argc < 2) { fprintf(STDERR, "Usage: swfdump <swf_file>\n"); exit(1); } $swf_filename = $argv[1]; $swfdata = file_get_contents($swf_filename); $obj = new SWFEditor(); if ($obj->input($swfdata) == false) { fprintf(STDERR, "input failed\n"); exit(1); } $tags = $obj->getTagList(); class SWFJpegFilter extends FilterIterator { public function accept() { $tag = $this->current(); if($tag['tagName'] == 'DefineBitsJPEG2') { return true; } return false; } } foreach (new SWFJpegFilter(new ArrayIterator($tags)) as $k => $jpeg) { $detail = $obj->getTagDetail($k); $imageId = $detail["image_id"]; file_put_contents($imageId.'.jpg', $obj->getJpegData($imageId)); }
参考:Tomblooハックス – Flash SWFからJPEGファイルを取り出す
http://ido.nu/kuma/2008/10/22/pure-javascript-implemented-flash-swf-file-parser/
*1:すいません、5.3でも対応してるようです。http://diary.awm.jp/~yoya/?200909b#200909131