2010-04-07 3 views
6

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

Мой скрипт работает нормально .. однако требуется 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/>'; 
} 

?> 

Сценарий СЛЕДУЕТ генерировать номера кадров, которые действительны? Все, что в пределах START-END должно быть действительным числом кадров? Но петля занимает много времени!

+0

30 минут? Что за? Я бы конвертировал 1 ТБ видео. –

ответ

4

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

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

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

0

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

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

НТН

C.

1

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

$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

это действительно отличное кодирование :) – danielad

+0

Я думаю, что положить if (count (output)) вещь на a ... цикл делает случайное значение с большим количеством эскизов правильно? – danielad

-5

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

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

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

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

+0

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

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