PHP + FFMPEG ile rastgele küçük üretmek

4 Cevap php

Ben FFMPEG ve FFMPEG-PHP uzantısı kullanarak bir film rastgele noktalarda gelen küçük oluşturmak için çalışıyorum.

My script works OK.. however takes 20 minutes just to generate 5-10 thumbnails!!

Komut daha sonra kare sayılar olarak kullanılan rastgele sayılar üreterek çalışır. Üretilen tüm sayılar filmler kare sayısı vardır.

Can you work out why this script is taking 20 mins to finish? If not, a better solution?

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

?>

Komut geçerli çerçeve numaralarını getirici OLMALIDIR? BAŞLANGIÇ içinde bir şey - SONUNDA geçerli çerçeve numaraları olmalıdır? Yine döngü yaşları alır!

4 Cevap

(Zaman içinde değil, kare sayısında) bir Approrpriate başlangıç ​​noktasına aramak ve -vframes 1 için -ss anahtarını kullanarak, ffmpeg komut ile çağırmak tam bir kare, örneğin ayıklamak için bunu söylemek için:

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

10 saniye arasında bir çerçeve ayıklamak ve onu arayacak images/shot_10.jpg

Ben film formatlarını hakkında çok şey bilmiyorum, ama sıkıştırma muhtemelen referans çerçeveleri ile bir tek geçişli delta sıkıştırma dayandığı referans çerçeveleri pozisyonu tanımlı değilse, bu sistemin tam film oynamak zorunda olduğu anlamına gelir Belirli almak için ofset. Her zaman arasında bir çerçeve arıyor, diyelim ki, yükleyerek bu kontrol etmek kolay olurdu 20 ofset ve çerçevelerin sayısı bazı değerine bölünür.

Bu durumda varsayarsak, bu bir başka sorunu var sizin algoritması tasarladık şekilde, başlangıç ​​sarmak ve 5 kare her biri için ileri aramak gerekir - Eğer önceden uzaklıklar oluşturulan, sonra kriteri liste, ffmpeg tek bir geçişte kareleri almak mümkün olabilir.

HTH

C.

Burada sorun sözcüğü random olduğunu. Ben video süresini başarı ile var ve o rasgele süre ile bir kare almak için deneyin. Daha fazla kare için kolayca değiştirilebilir:

    $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);

Eğer bir hata yazılı döngü var ...

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

Bu let için döngü while ifadesi ilk kez yanlış varsa yani $ i + + ayrıştırılır ve döngü olamaz sonsuz her kez çalışır söylüyor

: =) yani $ i + + döngü ve yürütme süresi 20 dakika 2 saniye sürer olmayan için dibinde yer