VideoCDからサムネイル画像一覧作成


ちょいと研究室で資料の動画をテラサーバーにアップしたのですが、この状態ですとどの動画にどんなものが入っているかわかりずらいよね。ってことでサムネイル画像作成プログラムを作りました。
以前flvをffmpegを使用してサムネイル画像作成をやったのでラクチン!っかとおもいきや、なんだかVideoCD形式が読めないんですが(−−〆)
#なかみは単なるmpegファイルでしょ? could not find codec parametersって・・・。
いろいろ調べたところ、mplayer で似たようなことができるとこのとこです。
mencoderとかも調べたけどこっちは動画エンコ向け
とりあえず、できました。
が、最初は秒指定をしていたいんだけど10分後などだとうまく取得できない。
しかたないからfpsをマックスにして動画全フレームを検索することにしました。
これならOKです。
#VideoCDはストリーミングだからうまく秒数が合わないのかなぁって
やりかたですが、まずmplayerが必要なのでダウンロード。
iriverter-0.16_win.zip (MPlayer/MEncoder 1.0 pre6-3.4.2同梱)
http://sourceforge.net/projects/iriverter/
PHPソースコードはこちら

<?php // VideoCD 2 PNG
set_time_limit ( 0 );
//VideoCDをおいてあるフォルダ
$dir_root = "F:\\VideoCD";
//マイコンテンツ
echo <<<EOD
<h1>VideoCD2Image</h1>
<ul>
 <li><a href="./?">リスト</a></li>
 <li><a href="./?m=convert">コンバート</a></li>
 <li><a href=""></a></li>
 <li><a href=""></a></li>
</ul>
<hr>
EOD;
if( $_GET['m'] == "" ){
    //サムネイル画像一覧
    $dir = dir( $dir_root );
    while( $item = $dir->read() ){
        if( $item != "." && $item != ".." ){
            //PNGファイルがあるディレクトリをオープン
            echo $dir_2 = "{$dir_root}/{$item}/MPEGAV";
            $dir_av = dir( $dir_2 );
            $mepgav = "";
            echo <<<EOD
<h2>{$dir_2}</h2>
EOD;
            while( $file = $dir_av->read() ){
                $tmp =  explode( "." , $file );
                //PNG ファイル見つけ
                if( $tmp[1] == "png" ){
                    $u = urlencode("{$dir_2}/{$file}");
                    echo <<<EOD
<img src="./?m=img&u={$u}" width="200">
EOD;
                }
            }
            echo <<<EOD
<hr>
EOD;
        }
    }
 }elseif( $_GET['m'] == "img" ){
     //画像出力用
     $u = urldecode( $_GET['u'] );
     echo file_get_contents( $_GET['u'] );
     exit;
 }elseif( $_GET['m'] == "convert" ){
     //サムネイル画像作成
     //ディレクトリオープン
     $dir = dir( $dir_root );
     while( $item = $dir->read() ){
         if( $item != "." && $item != ".." ){
             //MPEGファイルがあるディレクトリをオープン
             echo $dir_2 = "{$dir_root}/{$item}/MPEGAV";
             $dir_av = dir( $dir_2 );
             while( $file = $dir_av->read() ){
                 $tmp =  explode( "." , $file );
                 if( $tmp[1] == "DAT" ){
                     //MPEGファイルゲット
                     echo $sourcefile =  "{$dir_root}/{$item}/MPEGAV/{$tmp[0]}.DAT";
                     echo "<hr>";
                     //コマンド実行
                     echo $cmd = "mplayer -ss 2.2 -fps 3000000000 -frames 10 -vf framestep=800step -vo png:z=1 \"{$sourcefile}\"";
                     echo "<hr>";
                     exec( $cmd );
                     //ファイルの移動+お掃除
                     for( $i = 1 ; $i <= 10 ; $i ++ ){
                         $outfile = "0000000{$i}.png";
                         @copy( $outfile , "{$dir_root}/{$item}/MPEGAV/{$outfile}");
                         @unlink( $outfile );
                     }
                 }
             }
         }
     }
     exit;
  }
?>

この辺を参考にしました。
http://club.pep.ne.jp/~tamubun/computer/mplayer.html