2009-06-30 6 views
8

मैं सोच रहा हूं कि वीडियो के मध्य फ्रेम को पकड़ने के लिए एफएफएमपीईजी का उपयोग कैसे करें। मैंने पहले से ही एक फ्रेम को पकड़ने के लिए सी # लिखा है (यानी दूसरे फ्रेम पर एक फ्रेम खींचें)। लेकिन मुझे अभी तक यह पता लगाना नहीं है कि एफएफएमपीईजी कमांड का उपयोग करके वीडियो के मध्य को कैसे ढूंढें।वीडियो के मध्य फ्रेम प्राप्त करने के लिए FFMpeg का उपयोग करें?

उत्तर

8

इसे सरल बनाया जा सकता है, लेकिन यहां कुछ पुराना PHP कोड है जो मैं चारों ओर झूठ बोल रहा था जो चाल चलाना चाहिए। एक आकर्षण (परीक्षण किया) की तरह

$output = shell_exec("ffmpeg -i {$path}"); 
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches); 
$time = str_replace("Duration: ", "", $matches[0]); 
$time_breakdown = explode(":", $time); 
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]); 
shell_exec("ffmpeg -y -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds/2) . " -s {$w}x{$h} {$output_filename}"); 
+0

धन्यवाद, यही कारण है कि सिर्फ मैं क्या देख रहा था है! –

+0

@ डेरेक गथराइट कृपया मुझे ffmpeg के साथ काम करना शुरू करने के लिए बुनियादी विवरण दें। कृपया मेरा [प्रश्न] देखें (http://stackoverflow.com/questions/10071408/how-to-get-frames-of-video-file-in-android)। –

4

एफएफएमपीजी आपको फ़्रेमेट और वीडियो की लंबाई प्राप्त करने में सहायता करता है, ताकि आप बीच में एक से गुणा कर सकें और मध्यम फ्रेम की संख्या प्राप्त करने के लिए 2 से विभाजित कर सकें।

यानि 15 सेकंड प्रति सेकेंड पर चलने वाले 30 सेकंड के वीडियो के लिए: 30 * 15 = 450/2 = 225, जिसका अर्थ है कि आपको 225 वें फ्रेम को पकड़ना होगा।

0

यह बैश आदेश काम करता है (स्थान ffmpeg में जोड़े अगर यह आपके रास्ते में नहीं है):

avconv -i 'in.mpg' -vcodec mjpeg -vframes 1 -an -f rawvideo -s 420x300 -ss avconv -i in.mpg 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}' out.jpg 
2

उदाहरण

आप लिनक्स का उपयोग कर रहे मानते हुए

eval "$(ffprobe -v error -of flat=s=_ -show_entries format=duration input.mp4)" 
ffmpeg -ss "$(echo "$format_duration/2" | bc)" -i input.mp4 -q:v 2 -frames:v 1 half.jpg 
: ffprobe उपयोग कर सकते हैं अवधि पाने के लिए, bc आधा बिंदु की गणना करने के लिए, तो ffmpeg फ्रेम बनाने के लिए

यह उपयोग करने के लिए awk, tr, grep, sed, आदि

वैकल्पिक रूप से, आप select filter का उपयोग करें और bc को समाप्त कर सकता है किसी भी आवश्यकता समाप्त, लेकिन चयन फिल्टर धीमी गति से हो सकता है।

यदि फ़ाइल क्षतिग्रस्त या अनुचित तरीके से काट दिया गया ffprobe से अवधि गलत हो सकता है अवधि

बारे में एक नोट। अवधि पूरी तरह से ffmpeg तो सांत्वना उत्पादन में दूसरे स्थान पर करने के लिए अंतिम पंक्ति में time= टिप्पण साथ इनपुट डिकोडिंग द्वारा की पुष्टि की जा सकती है:

ffmpeg -i input -f null - 
… 
frame= 2600 fps=569 q=-0.0 Lsize=N/A time=00:01:48.50 bitrate=N/A 
video:244kB audio:20344kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown 
+0

विंडोज/सिग्विन पर मुझे $ format_duration के अंत से विंडोज़ न्यूलाइन को खत्म करने के लिए eval/ffprobe के आउटपुट की बदसूरत क्लड टेक्स्ट प्रोसेसिंग करना पड़ा: 'eval" $ (ffprobe -v त्रुटि -of flat = s = _ -show_entries प्रारूप = अवधि tmp.mp4) "' ' गूंज $ format_duration> tmp.txt' ' गूंज/2 >> tmp.txt' 'dos2unix tmp.txt' format_duration =' 'टीआर -d '\ n'

+0

मेरी टिप्पणी के अंतिम भाग में प्रारूप_ अवधि के बाद वेरिएबल असाइनमेंट के आस-पास बैकटिक्स का एक सेट है (जो मार्कडाउन पार्सिंग द्वारा यहां समाप्त किया गया है)। –