किसी समय में ffmpeg के साथ वीडियो के लिए 1 स्क्रीनशॉट कैसे निकालें?


109

कई ट्यूटोरियल और सामान दिखा रहे हैं कि ffmpeg का उपयोग करके वीडियो से कई स्क्रीनशॉट कैसे निकाले जाएं। आप सेट -r और आप भी एक निश्चित राशि में शुरू कर सकते हैं।

लेकिन मैं सिर्फ 1 स्क्रीनशॉट चाहता हूं, 01:23:45 में कहता हूं। या 86% में 1 स्क्रीनशॉट।

यह सब ffmpegthumbnailer के साथ संभव है, लेकिन यह एक और निर्भरता है जिस पर मैं निर्भर नहीं रहना चाहता। मैं इसे ffmpeg के साथ करने में सक्षम होना चाहता हूं।

जवाबों:


208

-ssविकल्प का उपयोग करें :

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • JPEG आउटपुट के उपयोग के -q:vलिए आउटपुट क्वालिटी को नियंत्रित करता है। फुल रेंज 1-31 का एक रेखीय पैमाना है जहां कम मूल्य का परिणाम उच्च गुणवत्ता में होता है। 2-5 कोशिश करने के लिए एक अच्छी रेंज है।

  • चुनिंदा फिल्टर इस तरह के चयन केवल कुछ फ्रेम प्रकार, या 1 100 प्रति, आदि के रूप में और अधिक जटिल की जरूरत के लिए एक वैकल्पिक तरीका प्रदान करता है

  • रखने -ssसे पहले इनपुट तेजी से हो जाएगा। FFmpeg विकी देखें : ffmpegक्ली टूल डॉक्यूमेंटेशन की तलाश और यह अंश :

-ss स्थिति (इनपुट / आउटपुट)

जब एक इनपुट विकल्प (पहले -i) के रूप में उपयोग किया जाता है , तो इस इनपुट फ़ाइल में स्थिति की तलाश की जाती है। सबसे प्रारूपों में ध्यान दें, यह वास्तव में तलाश करना संभव नहीं है, इसलिए ffmpegस्थिति से पहले निकटतम तलाश बिंदु की तलाश करेंगे। जब ट्रांसकोडिंग और -accurate_seekसक्षम किया जाता है (डिफ़ॉल्ट), यह अतिरिक्त बिंदु के बीच की तलाश और बिंदु को डिकोड किया जाएगा और छोड़ दिया जाएगा। स्ट्रीम कॉपी करते समय या जब -noaccurate_seekउपयोग किया जाता है, तो इसे संरक्षित किया जाएगा।

जब एक आउटपुट विकल्प (आउटपुट फ़ाइल नाम से पहले) के रूप में उपयोग किया जाता है, लेकिन जब तक टाइमस्टैम्प स्थिति तक नहीं पहुंच जाता तब तक इनपुट को डिकोड करता है।

स्थिति सेकंड या रूप में hh:mm:ss[.xxx]हो सकती है।


2
यह तेज है। बहुत बहुत धन्यवाद। -सीएस को पहले रखने से बहुत फर्क पड़ता है।
पीटर बेंग्सटन

क्या निर्दिष्ट समय के बाद n-वें फ्रेम प्राप्त करने का कोई तरीका है?
dorien

@GuntherPiez मुझे संभावित कलाकृतियों के बारे में कहीं भी कोई उल्लेख नहीं दिखता है।
स्टेफन रीच

2
ध्यान दें कि vframes(कम से कम) संस्करण 4.2.2 में अप्रचलित है। प्रति मैनुअल "[ vframes] ' -frames:v' के लिए एक अप्रचलित उपनाम है , जिसे आपको इसके बजाय उपयोग करना चाहिए।"
सिंटेक्सिस

सही और तेजी से काम करता है।
स्मालिंकिन

37

FFMpeg दिए गए टाइमस्टैम्प की मांग करके और छवि के रूप में बिल्कुल एक फ्रेम निकालकर ऐसा कर सकता है, उदाहरण के लिए देखें:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

चलो विकल्पों की व्याख्या करते हैं:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

-ssपैरामीटर के रूप में एक मूल्य को स्वीकार करता है HH:MM:SS[.xxx]या सेकंड में एक संख्या के रूप में। यदि आपको प्रतिशत की आवश्यकता है, तो आपको पहले से वीडियो अवधि की गणना करने की आवश्यकता है।


अपेक्षा के अनुरूप काम करने लगता है। मैं वर्तमान में बेंचमार्किंग कर रहा हूं यदि यह ffmpegthumbnailer का उपयोग करने के समान गति है।
पीटर बेंग्सटन

हाँ, यह दृष्टिकोण सुपर धीमा है। देखें peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
पीटर वेनगटसन

7
-i से पहले -ss विकल्प का उपयोग करने का प्रयास करें क्योंकि यह पाइपलाइन के डिकोडिंग भाग को छोड़ देगा। यह प्रक्रिया को गति दे सकता है।
20

1
क्या फाइल के बजाय स्ट्रीम में PNG के रूप में आउटपुट करने का कोई तरीका है?
निके मैनारिन

1
@NickeManarin हाँ .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg। ध्यान दें कि मैंने कमांड लाइन पर इनपुट फ़ाइल से पहले-ss "तलाश" विकल्प भी रखा है , जैसा कि अन्य लोगों ने सुझाया है।
ग्लेन स्लेडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.