【发布时间】:2012-04-14 03:36:05
【问题描述】:
我正在尝试使用 ffmpeg 从视频中提取缩略图,因此我使用的是命令行:
ffmpeg -i video.mp4 -vframes 1 -an -f image2 -y thumbmail.png 2>&1
但在大多数情况下,第一帧是全黑的。 所以,我正在做的是:
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;
}
其中isGoodKeyFrame方法定义为:
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;
}
所以基本上我正在做的是捕获 1 到 MAX_FRAME_CHECKING 帧,检查它们的颜色直方图,当我发现颜色超过我的最小阈值的东西时,我会中断循环并返回该帧。
有没有办法用 ffmpeg 本地做到这一点?
谢谢
【问题讨论】: