2010-04-07 23 views
6

Próbuję generować miniatury z losowych punktów w filmie przy użyciu rozszerzeń FFMPEG i FFMPEG-PHP.Generowanie losowych miniatur za pomocą PHP + FFMPEG

Mój skrypt działa OK .. jednak zajmuje 20 minut, aby wygenerować 5-10 miniatur!

Skrypt działa poprzez generowanie liczb losowych, które są później używane jako numery ramek. Wszystkie wygenerowane liczby mieszczą się w zakresie liczby klatek filmu.

Czy możesz wyjaśnić, dlaczego ten skrypt trwa 20 minut? Jeśli nie, lepszym rozwiązaniem?

<?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/>'; 
} 

?> 

Skrypt powinien generować numery ramek, które są prawidłowe? Wszystko w ramach START-END powinno być prawidłowymi numerami ramek? A jednak pętla trwa wieki!

+0

30 minut? Co? Chciałbym przekonwertować 1 TB wideo. –

Odpowiedz

4

Można powołać ffmpeg z linii poleceń, za pomocą przełącznika -ss szukać do approrpriate start-punkt (w czasie, a nie w liczbie klatek) i -vframes 1 aby poinformować go wydobyć dokładnie jedną ramkę, np

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

rozpakuje ramkę od 10 sekund i nazywają to images/shot_10.jpg

0

nie wiem wiele o formatach filmowych, ale ponieważ kompresja prawdopodobnie opiera się na jednym z kompresją wprost trójkąt ramy odniesienia, jeżeli położenie ramek odniesienia i nie zdefiniowane, oznacza to, że system musi odtwarzać cały film, aby uzyskać określone przesunięcie. Łatwo to sprawdzić, ładując, powiedzmy, szukając ramki między offsetem 20 a liczbą ramek podzielonych przez pewną wartość.

Zakładając, że tak jest, masz dalsze problemy z tym, jak zaprojektowałeś swój algorytm, musisz przewinąć do początku i wyszukiwać dalej dla każdej z 5 klatek - jeśli wcześniej wygenerowałeś przesunięcia , a następnie posortowane listy, ffmpeg może być w stanie pobrać ramki w jednym przebiegu.

HTH

C.

1

Problemem tutaj jest słowo losowo. Udało mi się uzyskać czas trwania filmu, a następnie spróbować uzyskać jedną klatkę z tym losowym czasem trwania. Łatwo można modyfikować w celu uzyskania większej liczby ramek:

$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

to naprawdę świetne kodowanie :) – danielad

+0

Myślę, że umieszczenie elementu if (count (output)) na pętli for ... powoduje, że wartość losowa ma więcej miniaturek? – danielad

-5

Napisałeś błąd w swojej pętli.

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

Powiedzmy, że pętla for działa w nieskończoność, dopóki nie zostanie zerwana. Jeśli instrukcja if jest fałszywa za pierwszym razem, więc $i++ nie może zostać osiągnięte, a pętla jest nieskończona.

Musisz umieścić $i++ na dole pętli for, następnie wykonanie będzie 2 sekundy zamiast 20 minut.

+0

To zachowanie jest zamierzone.Pętla ma zostać wykonana, dopóki nie zostanie wybranych pięć ramek, więc liczba wzrasta tylko wtedy, gdy istnieje losowo wybrana ramka. – joequincy

Powiązane problemy