flv動画を画像として切り出すよ with PHP(ソース付き)
flv動画から画像としてゲットしたくなってやってみました。
目的は指定した時間の画像をゲットすることです。
基本的にはffmpegが裏で動いているだけなので、phpはGUIの部分となります。
サンプルサムネイル画像
FLVをすべてJPGにした画像
ちなみに古いffmpegだと最新のニコ動に使われているコーデックが
読めない場合があるので、最新のをダウンロードします。
Windowsなffmpegの新しいのはこちら
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で連携してみたいなぁ。