【问题标题】:FFMpeg video thumbnail frame extractionFFMpeg 视频缩略图帧提取
【发布时间】: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 本地做到这一点?

谢谢

【问题讨论】:

    标签: php ffmpeg frame imagick


    【解决方案1】:

    我不知道。我认为最简单的解决方案之一是使用 -ss 命令寻找位置以提取缩略图。

    根据 ffmpeg 文档:

    '-ss 位置(输入/输出)' 当用作输入选项时(在 -i 之前),在此输入文件中查找位置。当用作输出选项时(在输出文件名之前),解码但丢弃输入,直到时间戳到达位置。这速度较慢,但​​更准确。

    位置可以是秒或 hh:mm:ss[.xxx] 形式。

    【讨论】:

    • 嗯,我不能确定在 X 位置有一个非黑框,所以我想我的解决方案现在更好:(
    • 除非您提取该帧并且您可以使用库来检查图像中的像素以查看其是否全黑,然后如果是,则只需选择不同的帧号,否则使用该帧.
    猜你喜欢
    • 2018-12-21
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2020-03-03
    相关资源
    最近更新 更多