2010-04-07 14 views
6

के साथ यादृच्छिक थंबनेल जेनरेट करना मैं FFMPEG और FFMPEG-PHP एक्सटेंशन का उपयोग कर मूवी में यादृच्छिक बिंदुओं से थंबनेल जेनरेट करने का प्रयास कर रहा हूं।PHP + FFMPEG

मेरी स्क्रिप्ट ठीक काम करती है .. हालांकि 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 के भीतर कुछ भी वैध फ्रेम संख्या होना चाहिए? फिर भी लूप उम्र लेता है!

+0

30 मिनट? क्या? मैं 1TB वीडियो को बदल दूंगा। –

उत्तर

4

आप कमांडलाइन से ffmpeg आह्वान सकता, एक approrpriate की तलाश शुरू कर सूत्री (समय में, फ्रेम की संख्या में नहीं) -ss स्विच का उपयोग और -vframes 1 वास्तव में एक फ्रेम, जैसे निकालने के लिए यह बताने के लिए:

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

, में 10 सेकंड से एक फ्रेम निकालने होगा और कॉल यह images/shot_10.jpg

0

मैं इस फिल्म स्वरूपों बारे में बहुत कुछ पता नहीं है, लेकिन जब से संपीड़न शायद संदर्भ फ्रेम के साथ एक भी पास डेल्टा संपीड़न पर निर्भर करता है, तो संदर्भ फ्रेम की स्थिति i परिभाषित नहीं किया गया है, इसका मतलब है कि किसी विशेष ऑफसेट पर जाने के लिए सिस्टम को पूरी फिल्म खेलना है। ऑफ़सेट 20 के बीच एक फ्रेम की तलाश करना और कुछ मूल्य से विभाजित फ्रेम की संख्या को हमेशा लोड करके, यह देखना आसान होगा।

मान लीजिए कि यह आपके मामले में एक और मुद्दा है जिस तरह से आपने अपना एल्गोरिदम बनाया है, आपको 5 फ्रेम में से प्रत्येक के लिए शुरुआत करने और आगे की खोज करने की आवश्यकता है - अगर आपने अपने ऑफसेट को अग्रिम में जेनरेट किया है , फिर सूची को क्रमबद्ध किया गया है, ffmpeg फ्रेम को एक ही पास में लाने में सक्षम हो सकता है।

HTH

सी

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

मुझे लगता है कि अगर (गिनती (आउटपुट)) चीज़ को किसी पर रखना है ... लूप अधिक थंबनेल के साथ यादृच्छिक मान बनाता है? – danielad

-5

आपने अपने लूप में एक गलती लिखी है।

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

आइए कहें कि लूप टूटने तक असीम रूप से चलता है। यदि अगर कथन पहली बार गलत है, तो $i++ तक नहीं पहुंचा जा सकता है और लूप अंतहीन है।

आपको लूप के नीचे $i++ रखने की आवश्यकता है, तो निष्पादन 20 मिनट के बजाय 2 सेकंड होगा।

+0

व्यवहार का इरादा है।लूप को तब तक निष्पादित किया जाना चाहिए जब तक कि पांच फ्रेम का चयन नहीं किया जाता है, इसलिए गिनती केवल तभी बढ़ती है जब यादृच्छिक रूप से चयनित फ्रेम मौजूद होता है। – joequincy