2012-03-30 18 views
1

私は、ffmpegのと動画からサムネイルを抽出しようとしているので、私は、コマンドライン使用しています:FFMPEGビデオサムネールフレーム抽出

ffmpeg -i video.mp4 -vframes 1 -an -f image2 -y thumbmail.png 2>&1 

をしかし、ほとんどの場合、最初のフレームが完全に黒です。 だから、私は何をやっていることです:

isGoodKeyFrame方法は次のように定義されて
for($i = 1; $i < MAX_FRAME_CHECKING; $i++) 
{ 
    $cmd = sprintf('ffmpeg -i video.mp4 -vframes 1 -an -vf select="eq(n\,%d)"-f image2 -y thumbmail.png 2>&1', $i); 

    @exec($cmd, $aOutput, $iReturnValue); 

    if(self::isGoodKeyFrame('thumbmail.png')) 
    break; 
} 

:だから、基本的に私がやっている

private static function isGoodKeyFrame($sImagePath) 
{ 
    if(class_exists('Imagick')) 
    { 
    $hImagick = new Imagick(); 

    try 
    { 
     if ($hImagick->readImage($sImagePath) && $hImagick->valid()) 
     { 
     $hQuantized = @$hImagick->clone(); 
     $hQuantized->quantizeImage(255, Imagick::COLORSPACE_RGB, 0, TRUE, FALSE); 

     return count($hQuantized->getImageHistogram()) > self::HISTOGRAM_SIZE_THRESHOLD; 
     } 
     else 
     error_log("'$sImagePath' is not a valid image."); 
    } 
    catch(Exception $e) 
    { 
     error_log($e->getMessage()); 
    } 

    $hImagick->clear(); 
    $hImagick->destroy(); 

    } 
    else 
    error_log('Imagick not installed.'); 

    return TRUE; 
} 

は、その色ヒストグラムを確認し、MAX_FRAME_CHECKINGフレームにキャプチャ1であります私は私の最小しきい値より多くの色で何かを見つけると、私はループを破り、そのフレームを返します。

ffmpegでこれをネイティブに行う方法はありますか?

ありがとうございました

答えて

1

私は認識していません。最も簡単な解決策の1つは、-ssコマンドを使用してサムネイルを抽出する位置を探すことだと思います。 ffmpegのドキュメントパー

「-ss位置(入力/出力)」 (-iの前に)入力オプションとして使用する場合は、ポジションには、この入力ファイルに努めます。 (出力ファイル名の前に)出力オプションとして使用すると、タイムスタンプが位置に達するまで入力をデコードして破棄します。これは遅くなりますが、より正確です。

位置は、秒単位でも、hh:mm:ss [.xxx]形式でもかまいません。

+0

私はXの位置に黒いフレームがないことを確かめることができませんので、私の解決策は今より良いと思います:( –

+0

そのフレームを抽出し、ライブラリを使って画像がすべて黒であるかどうかを確認し、そうであれば別のフレーム番号を選択し、そうでなければそのフレームを使用します。 – SB2017