Calender
Sun Mon Tue Wed Thu Fri Sat
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< September 2018 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< LinuxでFAT32フォーマット | main | less,viの文字化け対策(debian) >>
動画のサムネイル化 PHPスクリプト
 特定フォルダにある、特定の拡張子(mp4,wmv,m2p等)の動画ファイルの2分毎の画像を一覧にし、出力フォルダにJPEGファイルとして保存します。
 ffmpegが必要です、ffmpegで動画を指定秒間隔でjpeg化しそれを最後に横にならべた画像に変換するだけです、バックグラウンドで動かしたかったのでシェル化してあります。


上の方のコメントアウトしてあるffmpegのコマンドを利用すれば、h264変換や、flv化もできます

リンク:
 JojoWiki:ffmpeg
ソースは続きにおいておきます
#!/usr/bin/php
<?
//INPUTフォルダの中のにある動画ファイルをファイルのサムネイル作成
//OUTPUTフォルダに出力

//変換元のディレクトリ場所(動画ファイルが入っている)
define('INPUT_DIR','/home/queue/samu');

//変換後のファイルの出力先(出力先(フォルダ構成は変換元と同一の構成を作成し出力)
define('OUTPUT_DIR','/home/output');

//対象となる拡張子
$exts = array('wmv' => '1','mp4' => '1','mpg' => '1','m2p' => '1');

define('THUMB_WIDTH',72);    //1つ辺りのサムネイル幅
define('THUMB_HEIGHT',54);//1つ辺りのサムネイル高
define('DEBUG',false);

define('THUMB_PER',120);//何秒に一枚取得するか

$rate 1/THUMB_PER;

//実行コマンド
//$cmdfmt_mp4 ="/usr/bin/ffmpeg -i '%s' -vcodec h264 -level 13 -ar 32000 -b 800k '%s'";
//$cmdfmt_flv ="/usr/bin/ffmpeg -i '%s' -vcodec flv -s 320x160 -ar 22050 -ac 1 -ab 24 -f flv '%s'";
$cmdfmt_sum ="/usr/bin/ffmpeg -i '%s' -pix_fmt jpeg -r $rate -ss 5 -an -s ".THUMB_WIDTH.'x'.THUMB_HEIGHT." -deinterlace '%s%%03d.jpg'";

set_time_limit(0);

$xml='';
//最初にフォルダ構造を取得してから処理を開始
//ファイルの抽出条件が多くなりそうなので
$ftree = new CDOMFileTreeINPUT_DIR );

if (
DEBUG$ftree->save(__FILE__.'0.xml');

//基本となるパスを取得しておく
$basepath $ftree->documentElement->getAttribute('path');

//----------変換処理---------
//原点フォルダを取得 特定のサブフォルダを原点にしたい場合は以下のように
//$nodes = $ftree->xpath->query('//file[@name="thamb"][@type="dir"]');
$nodes $ftree->xpath->query('//file[@type="dir"]');

if (
$nodes->length != 0) {
    
//フォルダあり
    //echo $nodes->length;
    
$node=$nodes->item(0);
    if (
DEBUG$ftree->save(__FILE__.'1.xml',$node);

    
$files $ftree->xpath->query('.//file[@type = "file"]',$node);//mp4下のファイルだけを抽出
    
    
umask(0);
    foreach (
$files as $f){
        
$dir =  substr($f->parentNode->getAttribute('path'),strlen($basepath));
        
$strFname $f->getAttribute('name');
    
$arrPath pathinfo$strFname );
        
//$strExt   = $f->getAttribute('name');
        //処理対象ファイルか
        
if ( $exts[strtolower($arrPath['extension'])] =='1'){
            
$strTgtFile OUTPUT_DIR $dir.'/'.$strFname.'';
            
$strTgtDir  OUTPUT_DIR $dir;
            if (
file_exists($strTgtFile.'.jpg')){
                echo 
'**exists**.'.$strTgtFile."¥n";
                continue;
            };
            
$strSrcFile $f->parentNode->getAttribute('path'). '/' .$strFname;
            if (!
file_exists$strTgtDir )) mkdir$strTgtDir ,0777true );
            
$cmd sprintf($cmdfmt_sum,  $strSrcFile,   $strTgtFile );
            
//サムネイルの作成
            
if (!DEBUG) {

                
//▽サムネイルイメージファイルを作成▽
                //**コマンド実行**
                 
exec$cmd );
                
//ファイルをひとつにまとめる
                
$strGlob str_replace(array('[',']','(',')'),array('?','?','?','?'),$strTgtFile);
                
                
$sums glob($strGlob.'*');
                
//△サムネイルイメージファイルを作成△

                //▽サムネイルイメージファイルを結合▽
                
if (count($sums)>1){
                    
$baseimg imagecreatetruecolor((count($sums)-1)*THUMB_WIDTHTHUMB_HEIGHT);
                    
//imagefill($baseimg,0,0,$cc);
                    
$xoffset = -THUMB_WIDTH;
                    foreach (
$sums as $sum){
                        
$img imagecreatefromjpeg($sum);
                        
imagecopy($baseimg,$img,$xoffset,0,0,0,THUMB_WIDTH,THUMB_HEIGHT);
                        
$xoffset +=(THUMB_WIDTH);
                        
unlink($sum);
                        
imagedestroy($img);
                    }
                    
imagejpeg($baseimg,$strTgtFile.'.jpg');
                    
imagedestroy($baseimg);
                }
                
//△サムネイルイメージファイルを結合△
            
} else {
                
//デバッグモードの時はコマンド表示のみ
                
echo $cmd;
            }
            
//rename($strSrcFile,$strSrcFile.'.org');
        
} else {
            echo 
'skip.'.$strFname."¥n";
        }
    }

}

//指定ディレクトリからのファイルツリーの状態を取得するクラス
class CDOMFileTree extends DOMDocument {

    
//この辺はあえて隠蔽化しない
    
public $xpath;

    
//コンストラクタ
    
function __construct$org ) {
        
DOMDocument::__construct('1.0','utf-8');
        if (!
file_exists$org )) $org realpath('.');
        
$xml $this->dirs_xml($org);
        if (
$this->loadXML($xml)) $this->xpath = new DOMXPath($this);
    }

    
//ディレクトリをXML文字列にする
    
private function dirs_xml($f){
        
$s1 = @filesize($f);
        
$s2 = @filetype($f);
        
$s3'';//
        
$s4= @strftime("dt='%y/%m/%d %H:%M:%S'",filemtime($f));//
        
$s5='';

        
$fname basename($f);
        
//ファイルの場合
        
if ($s2 == 'dir') {
            
//(2)ファイル個数
            
$strGlob str_replace(array('[',']','(',')'),array('?','?','?','?'),$f);
            
            
$list glob($strGlob.'/*',GLOB_NOSORT);
            
$s5count($list);
            
$result =  "<file name=¥"$fname¥" size=¥"$s1¥" type=¥"dir¥" path=¥"$f¥" $s4 count=¥"$s5¥">";
            foreach ( 
$list as $ff) {
                if ((
$ff != '.') && ($ff != '..')){
                        
$result .= $this->dirs_xml$ff );
                };
            };
            
$result .=  "</file>";
        } else {
            
$s2arr explode('.',$f);
            
$s3 strtolower($s2arr[count($s2arr)-1]);
            
$result =  "<file name=¥"$fname¥" size=¥"$s1¥" type=¥"$s2¥" ext=¥"$s3¥" $s4/>";
        }
        return 
$result;
    }
}




?>
| 開発関連 | 02:35 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/1124901