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がなくてもjpeg取り出せますね。


参考: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