FFMpeg извлечение видео миниатюр кадров - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь извлечь эскиз из видео с помощью 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?

Спасибо

1 Ответ

2 голосов
/ 30 марта 2012

Не то, чтобы я знал.Я думаю, что одним из самых простых решений было бы использование команды -ss для поиска позиции для извлечения миниатюры.

Согласно документации ffmpeg:

'- ss position (input /output) 'При использовании в качестве параметра ввода (до -i) ищет в этом файле ввода позицию.При использовании в качестве параметра вывода (перед именем выходного файла) декодирует, но отбрасывает ввод, пока отметки времени не достигнут позиции.Это медленнее, но более точно. Позиция

может быть в секундах или в формате чч: мм: сс [.xxx].

...