я пытаюсь извлечь миниатюру из видео с помощью FFmpeg, поэтому я использую командную строку: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?
Thanks
Ну, я не могу быть уверен, что в позиции X есть не черная рамка, поэтому я думаю, что мое решение лучше прямо сейчас :( –
Если вы не извлечете этот фрейм, и вы можете использовать библиотеку для проверки пикселей в чтобы увидеть, все ли это черное, а затем, если это так, просто выберите другой номер кадра, иначе используйте этот кадр. – SB2017