मैं फ्रेम के साथ जुड़े टाइमस्टैम्प कैसे निकालता हूँ -r विकल्प के साथ एक वीडियो से अर्क?


12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

क्या कमान मैं फ्रेम निकालने के लिए उपयोग कर रहा हूं और यह ठीक उसी तरह काम कर रहा है जैसे मुझे उम्मीद थी। हालाँकि मैं फ्रेम के टाइमस्टैम्प को भी देखना चाहता हूँ। जो भी सटीक हो। 100 मिलिसेकंड मेरे लिए काफी अच्छा है। Ffmpeg ऐसा कर सकता है?

अतिरिक्त विवरण प्रदान करना,

जब मैं उपरोक्त कमांड चलाता हूं तो मुझे लगभग 100 जेपीईजी मिलते हैं, मुझे लगता है कि इन जेपीईजीएस और वीडियो के फ्रेम के बीच 1 से 1 (या कई से 1) पत्राचार है। मैं फ्रेम के टाइमस्टैम्प को जानना चाहूंगा जो कि JPEG इमेज 'i' के रूप में आउटपुट था।

इसके अलावा मैं ffprobe की कोशिश की, लेकिन मुझे लगता है कि यह भी गलत तरीके से वीडियो अवधि रिपोर्ट :(


के रूप में क्या? AFAIK jpeg में ऐसा कोई मेटाडेटा नहीं है। EXIF टाइमस्टैम्प captureसमय के लिए है।
राजीव

निश्चित रूप से JPEG में मेटाडेटा नहीं है, लेकिन mp4 हो सकता है। क्या मैं ffmpeg को फ्रेम के साथ खींचने के लिए निर्देशित कर सकता हूं जो बाद में JPEGS के रूप में एन्कोड करता है और एक फाइल में टाइम स्टैम्प को डंप करता है?
Srini

कृपया ffmpegअपने कमांड से पूरा कंसोल आउटपुट शामिल करें ।
ललगन

ffprobe आपको mp4 वीडियो स्ट्रीम से टाइमस्टैम्प जानकारी दे सकता है। क्या आप पूछ रहे हैं कि यदि फ्रेम को डुप्लिकेट किया जा सकता है या गिराया जा सकता है तो मूल mp4 टाइमस्टैम्प से पत्राचार क्या है? उस स्थिति में, मैं यह देखने के लिए कि क्या आप निष्पादन के दौरान फ्रेम द्वारा फ्रेम प्राप्त कर सकते हैं, वर्बोसिटी सेटिंग्स बढ़ाने का पता लगाएंगे। क्या आप "फ्रेम से जुड़े टाइमस्टैम्प्स" से मतलब रख सकते हैं।
21

@dstob फ्रेम से जुड़े टाइमस्टैम्प्स इनपुट वीडियो की प्रस्तुति टाइमस्टैम्प हैं, अर्थात जब प्रत्येक फ्रेम को वीडियो की शुरुआत के सापेक्ष दिखाया जाना चाहिए।
slhck

जवाबों:


13

आप क्या कर सकते हैं फिल्टर के साथ फ़िल्टर करके छवि लेखन प्रक्रिया को "अनुकरण" करें fps, फिर ffprobeउत्पन्न फ्रेम के टाइमस्टैम्प्स का उपयोग करने के लिए। इसका मतलब है कि 25 एफपीएस पर, 50 वीं फ्रेम (आपकी 50 वीं छवि की तरह) में पीटीएस 2.00 सेकंड का होगा।

आप इसे इस तरह करते हैं:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

उत्पादन होगा:

0
0.04
0.08
0.12
0.16
...

ये प्रत्येक आउटपुट छवि के लिए टाइमस्टैम्प हैं। आप वास्तव में फ्रेम और टाइमस्टैम्प की सूची को जोड़ सकते हैं:

ls -1 छवि - *। jpeg> images.txt
ffprobe -f lavfi -i "मूवी = input.mp4, एफपीएस = एफपीएस = 25 [बाहर 0]" -show_frames -show_entries फ्रेम = pkt_pts_time -of csv = p = 0: फ्रेम। txt
paste.txt के फ्रेम। txt> संयुक्त

इसके साथ एक फ़ाइल बनाएंगे:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

ध्यान दें कि यह बहुत अधिक फ्रेम या जानकारी आउटपुट की बहुत सारी लाइनें होने पर बाहरी लाइनों में हो सकता है। यह वहाँ थोड़ा गलत लगता है।


क्या यह आउटपुट पर स्थिर स्थिर के संबंध में टाइमस्टैम्प है या मूल mp4 टाइमस्टैम्प पर आउटपुट जेपीजी के पत्राचार के संबंध में है जो किसी भी फ्रैमरेट हो सकता है और कोई टाइमस्टैम्प मान हो सकता है?
dstob

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

जब आप मैन्युअल रूप से आउटपुट टाइम बेस बना रहे हैं तो केवल एक ही समय आधार क्यों होना चाहिए? यह हमेशा निश्चित रूप से नहीं होगा, लेकिन पहले 60 एफपीएस वीडियो पर मैंने इसे फेंक दिया, ffmpeg ने इनपुट के समय टिकटों की अनदेखी करते हुए अपना स्वयं का समय आधार बनाया।
dstob

यकीन नहीं होता कि मैं समझ गया हूँ कि आप वास्तव में क्या कर रहे हैं। ffmpeg इनपुट टाइमबेज के रूप में चयन करता है जो भी इसे पहली इनपुट फाइल के टाइमबेस के रूप में देखता है । आप निश्चित रूप से ffmpeg को इनपुट टाइमस्टैम्प को दूर फेंकने के लिए भी कह सकते हैं -vsync drop, लेकिन फ़िल्टरिंग, IIRC के बाद ऐसा होता है।
slhck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.