2012-03-30 4 views
1

я пытаюсь извлечь миниатюру из видео с помощью 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

ответ

1

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

За документацию FFmpeg:

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

позиция может быть как в секундах, так и в формате hh: mm: ss [.xxx].

+0

Ну, я не могу быть уверен, что в позиции X есть не черная рамка, поэтому я думаю, что мое решение лучше прямо сейчас :( –

+0

Если вы не извлечете этот фрейм, и вы можете использовать библиотеку для проверки пикселей в чтобы увидеть, все ли это черное, а затем, если это так, просто выберите другой номер кадра, иначе используйте этот кадр. – SB2017

Смежные вопросы