Ffmpeg का उपयोग करके वीडियो से मुख्य फ़्रेमों का सूचकांक निकालना


17

मैं एक वीडियो से मुख्य फ्रेम निकालने के लिए ffmpeg का उपयोग कर रहा हूं। यह आज्ञा है:

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

मैं वीडियो में निकाले गए प्रत्येक कुंजी फ़्रेम का सूचकांक कैसे प्राप्त कर सकता हूं? उदाहरण के लिए, पहले I- फ्रेम के लिए, इंडेक्स 0 होगा, दूसरे के लिए, यह 24 होगा, आदि।



Ffprobe का उपयोग करने पर ध्यान दें तो सूचकांक प्राप्त करने के लिए आउटपुट की प्रक्रिया करें?
dstob

@dstob आप क्या मतलब है के बारे में अधिक बता सकते हैं? के रूप में मैं ffmpeg के लिए नया हूँ।
फतेन खलीफा

@LordNeckbeard वीडियो फ़्रेम में फ़्रेम संख्या, पूर्व। वीडियो का पहला फ्रेम 0 इंडेक्स पर होगा। मैं वीडियो फ्रेम में प्रत्येक कुंजी फ्रेम के सूचकांक को जानना चाहता हूं।
फातिन खलीफा

आप चाहते हैं कि फ़्रेम संख्या को थंबनेल पर (छवि पर ही) मुद्रित किया जाए?
ललगन

जवाबों:


21

उल्लिखित @dstob की तरह, आप I- ffprobeफ्रेम और उनकी संबंधित जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं । डाउनलोड पेज परffprobe कुछ स्टैटिक बिल्ड के साथ आता है और इसे सोर्स से भी बनाया जा सकता है।

यह आप लिनक्स / यूनिक्स पर मान रहे हैं:

फ्रेम और फ्रेम प्रकार निकालें

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1

grepकमांड के साथ लाइनों फिल्टर Iउन में, और उनके सूचकांक (का उपयोग कर गिना जाता है -nविकल्प)। cutआदेश उत्पादन केवल (इंडेक्स) के पहले स्तंभ का चयन करता है। ध्यान दें कि यह सूचकांक 1-आधारित है, न कि 0-आधारित।

सूचकांक के आधार पर आउटपुट फ़ाइलों का नाम बदलें

आप वास्तव में इन सूचकांकों को एक सूची में पाइप कर सकते हैं:

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt

फिर सभी थंबनेल की सूची भी बनाएं:

ls -1 thumbnails*.jpeg > thumbnails.txt

फिर उन दोनों को एक साथ चिपकाएँ:

paste thumbnails.txt frame_indices.txt > combined.txt

सूची में अब थंबनेल और सूचकांक का नाम शामिल है। उसी के आधार पर नाम बदलें:

while read -r thumbnail index; do
  newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
  mv -- "$thumbnail" "thumbnail-$newIndex.jpeg"  # rename file
done < combined.txt

इसके बाद के संस्करण का नाम बदल देगा thumbnail-01.jpegकरने के लिए thumbnail-0.jpeg। ध्यान दें कि आउटपुट इंडेक्स पर कोई जीरो-पेडिंग नहीं है। यदि आप इसे 5-अंकों के लिए शून्य-पैड करना चाहते हैं, तो उपयोग करें printf:

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

विंडोज पर, आप ठीक उसी के साथ करेंगे, ffprobeलेकिन आउटपुट को अलग तरीके से पार्स करेंगे। हालांकि नाम बदलने का प्रदर्शन कैसे करना है, इसका कोई अंदाजा नहीं है।


यह त्रुटि प्रदर्शित होती है: 'grep' को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है।
फतेन खलीफा

2
ऐसा इसलिए है क्योंकि आप विंडोज पर हैं। जैसा कि मैंने कहा, यह जवाब लिनक्स या यूनिक्स को मानता है। आप अपने प्रश्न में अधिक विशिष्ट नहीं थे। आप Windows के लिए Cygwin या इसी तरह के GNU / Linux लेयर्स का उपयोग करके विंडोज पर समान हासिल कर सकते हैं ।
slhck

यह एक बहुत बड़ी मदद है, धन्यवाद। एक सुधार: मुझे लगता है कि आपके पहले आदेश में सूचकांक तीन के एक कारक से दूर हैं, क्योंकि प्रत्येक पंक्ति के लिए एक [FRAME]पंक्ति और एक पंक्ति है। [/FRAME]pict_type
जैक ओ'कॉनर

2
@ JackO'Connor यदि आप -of csvविकल्प का उपयोग करते हैं तो प्रति फ्रेम केवल एक पंक्ति है ffprobe। हालांकि आप जो भी वर्णन कर रहे हैं वह डिफ़ॉल्ट आउटपुट प्रारूप है, हालांकि।
15:52

0

यदि आप मूल रूप से FFMPEG का उपयोग करना चाहते हैं, तो आप सभी या आंशिक सूची को सूचीबद्ध कर सकते हैं और निम्नलिखित के साथ jpg भी बना सकते हैं:

ffmpeg.exe \
  -i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
  -t 15 \
  -vf select="eq(pict_type\,PICT_TYPE_I)" \
  -vsync 2 \
  -s 160x90 \
  -f image2 thumbnails-%02d.jpeg \
  -loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"

-t 15कोई समय सीमा या सूट में परिवर्तन के लिए निकालें । -s 160x90 -f image2 thumbnail-%02d.jpegथम्ब निष्कासन के लिए निकालें या बदलें।


विंडोज 7 सीएमडी में, यह \ पर विफल रहता है। \ _ को बदलने से कारण विफल हो जाता है: I "। क्या आपके पास Windows पर काम करने वाला संस्करण है?
ChrisJJ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.