flv動画を画像として切り出すよ with PHP(ソース付き)

flv動画から画像としてゲットしたくなってやってみました。
目的は指定した時間の画像をゲットすることです。
基本的にはffmpegが裏で動いているだけなので、phpはGUIの部分となります。
サンプルサムネイル画像

FLVをすべてJPGにした画像

ちなみに古いffmpegだと最新のニコ動に使われているコーデックが
読めない場合があるので、最新のをダウンロードします。
Windowsffmpegの新しいのはこちら
http://arrozcru.no-ip.org/ffmpeg_builds/

<?php
//flv2jpg with PHP
//制限時間解除
set_time_limit ( 0 );
//FLVがあるフォルダ
$flv_dir = "./flv";
//画像を書き出すフォルダ
$img_dir = "./image";
if( $_GET['m'] == "" ){
    //ファイルリスト表示+サムネイル作成
    //10秒後の動画をキャプチャー
    $time = "00:00:10";
    //ファイルリストの取得
    $directory = opendir($flv_dir);
    while ($file = readdir($directory)){
        if( $file != ".." && $file != "." ){
            $file_a = explode( "." , $file );
            //FLVファイル見つける
            if( $file_a[1] == "flv" ){
                $basename = basename( $file , ".flv" );
                $sourcefile = "{$flv_dir}/{$file}";
                $outfile = str_replace( ":", "_", "{$flv_dir}/{$basename}_{$time}.jpg" );
                //サムネイル画像ある?
                if( !file_exists( $outfile) ){
                    //ないので作成
                    $cmd = "ffmpeg -i {$sourcefile} -f image2 -ss {$time} -vframes 1 {$outfile} ";
                    exec( $cmd );
                }
                //リスト出力
                $MAIN .= <<<EOD
<div>
<p>{$time}</p>
<img src="{$flv_dir}/{$basename}.jpg"><br>
<form action="./tmp4.php" method="get">
<input type="hidden" name="m" value="make_thum">
<input type="hidden" name="flvid" value="{$basename}">
<input type="text"name="time" value="00:01:10">
<input type="submit" value="ゲットだぜ">
</form>
<a href="./tmp4.php?m=convert&flvid={$basename}">すべてコンバート</a>
</div>
EOD;
            }
        }
    }
}elseif( $_GET['m'] == "make_thum" &&  $_GET['time'] != "" &&  $_GET['flvid'] != "" ){
    //動画から時間指定のキャプチャー作成
    $time = $_GET['time'];
    $flvid = $_GET['flvid'];
    $sourcefile = "{$flv_dir}/{$_GET['flvid']}.flv";
    $outfile = str_replace( ":", "_", "{$flv_dir}/{$_GET['flvid']}_{$time}.jpg" );
    //すでにサムネイル画像ある?
    if( !file_exists( $outfile) ){
        //ないので作成
        $cmd = "ffmpeg -i {$sourcefile} -f image2 -ss {$time} -vframes 1 {$outfile} ";
        exec( $cmd );
    }
    //画像出力
    header("Content-type: image/jpeg");
    echo file_get_contents( $outfile );
    exit;
}elseif( $_GET['m'] == "convert" && $_GET['flvid'] != "" ){
    //すべてを画像に変換するよ
    //送られてきたデーターをゲットして格納する。
    //move_uploaded_file($_FILES['Filedata']['tmp_name'], "./flv/{$file}");
    //画像格納用フォルダ作成
    $dir = "{$img_dir}/{$_GET['flvid']}";
    @mkdir( $dir );
    $sourcefile = "{$flv_dir}/{$_GET['flvid']}.flv";
    $outfile = "{$dir}/%05d.jpg";
    //イロイロデバグ中
    //echo    $cmd = "ffmpeg -i \"flv/{$file}\" -f image2 -vcodec mjpeg \"image/{$_GET['flvid']}/%05d.jpg\"";
    //$cmd = "ffmpeg -i flv/{$file} -f image2 -ss 00:00:10 -vframes 1  -s 132x100 image/{$_GET['flvid']}/01.jpg ";
    //ffmpeg -i 入力flvファイル -f image2 -ss 00:00:10 -vframes 1 出力画像ファイル
    //$cmd = "ffmpeg -i flv/{$file} -f image2 -ss 00:00:10 -vframes 1 image/{$_GET['flvid']}/%05d.jpg ";
    //コマンド送信
    $cmd = "ffmpeg -i {$sourcefile} -f image2 -vcodec mjpeg {$outfile} ";
    exec( $cmd );
    //ファイルリストの取得
    $directory = opendir($dir );
    $cnt = 0;
    while ($file = readdir($directory)){
        if( $file != ".." && $file != "." ){
            $file_a = explode( "." , $file );
            //jpgファイル見つける
            if( $file_a[1] == "jpg" ){
                $cnt ++ ;
                if( $cnt % 30 == 0 ){
                    $MAIN .= <<<EOD
<img src="{$dir}/{$file}" width="100">
EOD;
                }
            }
        }
    }
 }
echo $MAIN;
exit;
?>

セキュリティとしてescapechellcmdをしてね。
phpな部分ができたので次はFlexで連携してみたいなぁ。