Генерация случайных миниатюр с помощью PHP + FFMPEG - PullRequest
6 голосов
/ 07 апреля 2010

Я пытаюсь сгенерировать миниатюры из случайных точек в фильме, используя расширение FFMPEG и FFMPEG-PHP.

Мой сценарий работает нормально, однако для генерации 5-10 миниатюр требуется 20 минут!!

Скрипт работает, генерируя случайные числа, которые позже будут использоваться в качестве номеров кадров.Все сгенерированные числа находятся в пределах количества кадров фильма.

Можете ли вы понять, почему этот сценарий занимает 20 минут, чтобы закончить?Если нет, лучшее решение?

<?php

//Dont' timeout
set_time_limit(0);

//Load the file (This can be any file - still takes ages) 
$mov = new ffmpeg_movie('1486460.mp4');

//Get the total frames within the movie
$total_frames = $mov->getFrameCount();

//Loop 5-10 times to generate random frames 5-10 times
for ($i = 1; $i <= 5; ) {
    // Generate a number within 200 and the total number of frames.
 $frame = mt_rand(200,$total_frames);
 $getframe = $mov->getFrame($frame);
 // Check if the frame exists within the movie
 // If it does, place the frame number inside an array and break the current loop
 if($getframe){
  $frames[$frame] = $getframe ;
  $i++;
 }
}

//For each frame found generate a thumbnail
foreach ($frames as $key => $getframe) {
 $gd_image = $getframe->toGDImage();
 imagejpeg($gd_image, "images/shot_".$key.'.jpeg');
 imagedestroy($gd_image);
 echo $key.'<br/>';
}

?>

Сценарий ДОЛЖЕН генерировать номера кадров, которые являются действительными?Что-нибудь в START - END должно быть действительными номерами кадров?И все же цикл занимает целую вечность!

Ответы [ 4 ]

4 голосов
/ 07 апреля 2010

Вы можете вызвать ffmpeg из командной строки, используя переключатель -ss для поиска подходящей начальной точки (по времени, а не по количеству кадров) и -vframes 1, чтобы сказать ей, чтобы извлечь ровно один кадр, например:

ffmpeg -i 1486460.mp4 -ss 10 -vframes 1 images/shot_10.jpg

Извлечет кадр из 10 секунд и назовет его images/shot_10.jpg

1 голос
/ 01 июня 2010

Проблема здесь в слове random .Я успешно получил продолжительность видео, а затем попытался получить один кадр с этой случайной продолжительностью.Легко модифицируется для большего количества кадров:

    $cmd = "ffmpeg -i {$src} 2>&1 |grep Duration";

    $output = array ();

    exec($cmd, $output);

    if(count($output)) {
        $duration = explode(':', trim(str_replace('Duration:', NULL, current(explode(',', current($output))))));
        list($hour, $min, $sec) = $duration;
        $sec = sprintf("%02d:%02d:%02d", rand(0, $hour), rand(0, $min), rand(0, $sec));
    } else {
        $sec = "00:00:12"; //12sec it's ok :)
    }

    $cmd = "ffmpeg -ss {$sec} -i {$src} -s {$w}x{$h} -f image2 -vframes 1 {$destination}";

    $output = array ();

    exec($cmd, $output);
0 голосов
/ 13 апреля 2011

Вы написали ошибку в своем цикле.

if($getframe) {
  $frames[$frame] = $getframe;
  $i++;
}

Допустим, цикл for работает бесконечно, пока не прервется. Если в первом случае оператор if ложен, значит, $i++ не может быть достигнуто, и цикл тогда бесконечен.

Вам нужно поместить $i++ внизу цикла for, тогда выполнение будет 2 секунды вместо 20 минут.

0 голосов
/ 07 апреля 2010

Я не очень разбираюсь в форматах фильмов, но поскольку сжатие, вероятно, основано на дельта-сжатии с однократным проходом с опорными кадрами, если положение опорных кадров не определено, это означает, что система должна воспроизводить полный фильм, чтобы добраться до определенного смещения. Было бы легко проверить это, всегда загружая, скажем, поиск кадра между смещением 20 и количеством кадров, поделенным на некоторое значение.

Если предположить, что это так, то у вас есть еще одна проблема, заключающаяся в том, что, как вы спроектировали свой алгоритм, вам нужно перемотать к началу и выполнить поиск для каждого из 5 кадров - если вы сгенерировали свои смещения заранее, затем отсортировав список, ffmpeg может получить кадры за один проход.

НТН

C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...