Генерация случайных миниатюр с PHP+FFMPEG

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

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

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

Можно ли разработать, почему этот сценарий занимает 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/>';
}

?>

Сценарий ДОЛЖЕН генерировать номера кадра, которые являются верными? Что-нибудь в ЗАПУСКЕ - КОНЕЦ должно быть числами допустимого кадра? Все же цикл берет возрасты!

6
задан MrGhost 7 April 2010 в 09:24
поделиться

3 ответа

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

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

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

4
ответ дан 18 December 2019 в 04:49
поделиться

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

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

HTH

C.

0
ответ дан 18 December 2019 в 04:49
поделиться

Проблема здесь в слове 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);
1
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: