मुझे लिनक्स कमांड लाइन पर एक वीडियो में फ़्रेम की संख्या कैसे मिलती है?


30

मेरे पास एक वीडियो फ़ाइल है और मैं उस वीडियो फ्रेम की संख्या प्राप्त करना चाहता हूं जो इसमें हैं। मैं ffmpegवीडियो की लंबाई और एफपीएस प्राप्त करने के लिए उपयोग कर सकता हूं । हालाँकि मैं तख्ते की कुल संख्या के लिए कुछ भी स्पष्ट नहीं देख सकता।

सिद्धांत रूप में, किसी को फ्रेम की संख्या प्राप्त करने के लिए एफपीएस द्वारा लंबाई (सेकंड में) को गुणा करने में सक्षम होना चाहिए, लेकिन इस मामले में लंबाई (34.43 सेकंड) और फ्रैमरेट (29.97 एफपीएस) एक गैर-पूर्णांक देता है, जो मुझे बनाता है मुझे लगता है कि मैं कुछ गलत कर रहा हूं।

मुझे कमांड लाइन पर पूरी तरह से स्वचालित और गैर-ग्राफ़िकल तरीके से ऐसा करने में सक्षम होना चाहिए। मैं भी यह बहुत सटीक होने की जरूरत है, और एक अनुमान नहीं (यदि यह वीडियो फ़ाइलों के साथ भी संभव है)

मैंने tcprobeकुछ फाइलों पर प्रयोग करने की कोशिश की । कुछ AVI फ़ाइलों के लिए यह काम करता है, लेकिन कुछ VOB फ़ाइलों के लिए, tcprobe आउटपुट में फ़्रेम की संख्या नहीं होती है। मुझे यह आउटपुट मिलता है:

[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
     aspect ratio: 4:3 (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
                   PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
      audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
                   PTS=2199.2763, bitrate=192 kbps
                   -D 3 --av_fine_ms 20 (frames & ms) [0] [0]

आपका समीकरण आपको एक अच्छा बॉलपार्क अनुमान देगा; फ्लोटिंग-पीटी परिणाम को गोल करें। यदि आपको सटीक संख्या में फ़्रेम की आवश्यकता है, तो आपको सीधे फ़ाइल की जांच करने की आवश्यकता होगी - आपका अनुमान वीडियो कोडेक के विवरणों के कारण या तो एक या दो दिशाओं में बंद हो सकता है।
क्विकोट

क्या ये सभी-इन-वन-फाइल VOBs या डीवीडी-शैली विभाजन-में-एकाधिक-फ़ाइल VOBs हैं?
क्वैक डिक्टोटेक्ट

जवाबों:


17

यह भयानक, और बेवकूफ है, और धीमा है, लेकिन काम करने के लिए लगता है:

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

यह छंटनी की गई फ़ाइलों और कच्ची धाराओं पर भी सही काम करेगा (यही कारण है कि आपको .vob फ़ाइलों के लिए कुछ भी नहीं मिलता है)।


वह बहुत बढिया है। मेरे अनुभव में, यह लंबा समय नहीं लगता है। एक 40 मिनट की फ़ाइल को चलाने के लिए लगभग 3 सेकंड लगता है। याद रखें कि "^ M" 2 अक्षर ^ और M नहीं है, आपको Control-V दबाना होगा, और फिर दर्ज करना होगा। आपके आदेश के बजाय मैंने उपयोग किया: ffmpeg -i somefile.avi -vcodec copy -f rawvideo -y / dev / null 2> & 1 | tr "^ M" '\ n' | grep '^ फ्रेम =' | perl -pe 's / ^ फ्रेम = \ s * ([0-9] +) \ s। * $ / \ 1 /' | tail -n 1 "कमांड = फ्रेम" के बाद कोई जगह नहीं होने पर आपका कमांड फेल हो जाता है
रोरी

1
Ubuntu 12.04 में, ffmpeg संस्करण Git-2013-04-15-a4f03f0, आप दोनों को छोड़ सकते हैं | tr ^M '\n'और |tail -n 1। इसके अलावा, कोई जगह नहीं के बाद frames=विफल नहीं है। (हो सकता है कि पिछले चार वर्षों में कुछ बदल गया हो।)
कैमिली गौडेय्यून

मेरे लिए यह हर बार अलग-अलग मूल्यों पर
लौटता है

1
Mediainfo समाधान VOB के साथ काम करता है .. मैं इसके बजाय सिफारिश करूंगा। रूट @ lanparty: / mnt / फिल्में # mediainfo --fullscan Bugs_Bunny.vob | grep -i फ्रेम \ count फ्रेम काउंट: 175715 फ़्रेम गणना: 183218
केविनफ़

32

ffprobe एक मीडिया फ़ाइल के बारे में जानकारी प्राप्त करने के लिए इस्तेमाल किया जा सकता है:

ffprobe -select_streams v -show_streams input.avi

आपको स्ट्रीम के बारे में विवरण मिलेगा:

nb_frames=159697

इसके nb_framesसाथ देखें grep:

ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'

यह एवी, mp4 और आदि के लिए काम करता है। कुछ कंटेनरों के लिए, यह वैध मान जैसे एमपीईजी नहीं दिखाता है।

उस मामले में, यह काम करता है ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l


अच्छा विचार। मैंने कमांड को थोड़ा संशोधित किया ताकि यह केवल वीडियो स्ट्रीम का चयन करे, और आउटपुट को फ़िल्टर करे। यह आपको केवल तख्ते की संख्या देता है।
slhck

1
आपके 2 समाधान के लिए बधाई जो MPEG-2 के साथ काम करता है!
मलोट

1
यह MKV कंटेनरों के साथ काम नहीं करता है।
सेनक एलटी


ऐसा लगता है कि पहला दृष्टिकोण VBR एन्कोडेड फ़ाइलों पर विफल रहता है। दूसरा दृष्टिकोण अधिक विश्वसनीय है।
एल्डर गीक

16

मैंने एक और सवाल पर यह पोस्ट किया । tcprobeटूल ( transcodeपैकेज से) का उपयोग करके , फ़्रेम की संख्या जानकारी में शामिल है। -iफ़ाइल से डंप जानकारी प्राप्त करने के लिए स्विच का उपयोग करें :

$ tcprobe -i foo.avi
[tcprobe] RIFF data, AVI video
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, channels=2, bitrate=128 kbps,
[avilib]    53707 chunks, 21768720 bytes, VBR
[tcprobe] summary for foo.avi, (*) = not default, 0 = not detected
import frame size: -g 512x384 [720x576] (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
      audio track: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
                   bitrate=128 kbps
           length: 38630 frames, frame_time=33 msec, duration=0:21:28.954

ध्यान दें कि तख्ते की संख्या यहां दो पंक्तियों में दी गई है (दूसरी आउटपुट लाइन और अंतिम आउटपुट लाइन)।


यह एक अच्छे उत्तर की तरह दिखता है, और कुछ फ़ाइलों के लिए काम करता है, लेकिन कुछ VOB फ़ाइलों के लिए, मेरे पास आउटपुट में वह डेटा नहीं है। मैंने आउटपुट के साथ प्रश्न को अपडेट किया है
रोरी

मुझे उम्मीद है (लेकिन निश्चित रूप से पता नहीं है) कि tcprobe इस जानकारी के लिए फ़ाइल हेडर की जांच कर रहा है। यदि यह शीर्ष लेख में शामिल नहीं है, तो tcprobe इसके लिए गणना का प्रयास नहीं कर सकता है। अच्छा प्रश्न; काश मैं तुम्हारे लिए एक अच्छा जवाब था
क्विक्सोटे

यह वीबीआर एन्कोडेड फाइलों पर काम करने के लिए प्रकट नहीं होता है मुझे कोई फ्रेम काउंट आउटपुट नहीं मिलता है। मैं संकल्प, पहलू अनुपात और फ्रेम दर प्राप्त करता हूं।
एल्डर गीक

7

मैंने पाया है कि mediainfo --fullscan inputfile | grep "Frame count"ज्यादातर फाइलों के लिए अच्छी तरह से काम करता है।

डेबियन आधारित सिस्टम के साथ इसे स्थापित कर सकते हैं apt-get install mediainfo

यदि आपको आउटपुट के बजाय 2 लाइनें मिलती हैं, तो पहली लाइन वीडियो ट्रैक है और दूसरी लाइन ऑडियो ट्रैक है। ऐसा प्रतीत होता है कि यह वैरिएबल बिट रेट ऑडियो वाली फाइलों पर होता है।

परीक्षण की तारीख के रूप में .mkv, .m4v, .mp4, flv, vob और .avi नमूनों पर परीक्षण किया गया।

स्रोत: लिनक्स के तहत कमांड लाइन से वीडियो फ़ाइल जानकारी कैसे प्राप्त करें? और उबंटू जायके के तहत परीक्षण।

आप अपने OS के लिए यहां उपलब्ध mediainfo पा सकते हैं


4

ffprobe -select_streams v -show_frames -count_frames INPUT_FILE | grep pkt_duration_time =

अवधि जोड़ें। Sed / awk के साथ कट्टर हो सकता है और क्या नहीं।

हमारे परीक्षण से मैं कह सकता हूं कि अब तक यह सबसे अधिक विश्वसनीय है। आपको एक सटीक फ्रेमाकाउंट और सटीक अवधि मिलती है। यहां तक ​​कि वैरिएबल फ्रैमरेट के साथ, जो कि मिडियाइफो जैसे अन्य सभी उपकरण गगा जाने लगते हैं।


3

मैंने पाया है कि फ्रेम की संख्या वास्तव में एफपीएस * अवधि से दोगुनी है (मुझे पता नहीं, मुझे खुशी होगी)।

मेरी एक स्क्रिप्ट में, मेरे पास है:

# Get duration and fps
duration=$($FFMPEG -i $input 2>&1 | sed -n "s/.* Duration: \([^,]*\), start: .*/\1/p")
fps=$($FFMPEG -i $input 2>&1 | sed -n "s/.*, \(.*\) tb.*/\1/p")

hours=$(echo $duration | cut -d":" -f1)
minutes=$(echo $duration | cut -d":" -f2)
seconds=$(echo $duration | cut -d":" -f3)
# For some reason, we have to multiply by two (no idea why...)
# Get the integer part with cut
frames=$(echo "($hours*3600+$minutes*60+$seconds)*$fps*2" | bc | cut -d"." -f1)

और हाँ, किसी कारण से मुझे इसका पूर्ण भाग प्राप्त करना होगा। इसका कोई मतलब नहीं है, लेकिन यह स्क्रिप्ट हमेशा अब तक मेरे वीडियो को ठीक से बदलने में कामयाब रही है।


क्योंकि एफपीएस का मतलब फ्रेम्स प्रति सेकंड (या पहले व्यक्ति शूटर: डी) है और अगर 30 एफपीएस है, तो इसे वीडियो में कितने सेकंड से गुणा करें।
जॉन टी

हाँ जॉन, मैं यह पता लगा सकता हूं, लेकिन यह स्पष्ट नहीं करता है कि मुझे फ्रेम की सही मात्रा प्राप्त करने के लिए इसे 2 से गुणा क्यों करना है ... मेरे मामले में, मैंने फ्रेम की मात्रा की गणना करने के बाद, मैंने ffmpeg लॉन्च किया पृष्ठभूमि और प्रगति बार बनाने के लिए लॉग का विश्लेषण किया। लॉग दिखाते हैं कि रूपांतरण में कितने फ़्रेम पास हुए हैं। एक बार जब पूरा वीडियो परिवर्तित कर दिया गया था, तो फ्रेम # int (सेकंड * एफपीएस * 2) था, इसलिए मेरा कोड था, लेकिन मैं जानना चाहूंगा कि ;-)
17'09

वह उत्सुक है; tcprobeमेरा उत्तर में उत्पादन बिल्कुल सेकंड * एफपीएस (गोल ऊपर) के रूप में फ़्रेम की संख्या देता है। मुझे उम्मीद है कि आप ffmpeg का एक क्विक देख रहे हैं। क्या आपने अन्य टूल के साथ फाइल का विश्लेषण करने की कोशिश की है कि क्या वे समान संख्या में फ्रेम दिखाते हैं?
क्वैक डिक्टोटेक

हम्म्म ... दिलचस्प। मैं एक वीडियो पर की कोशिश की और मुझे मिल गया seconds*fps=1001.59और tcprobe=1002। तो जाहिर है, tcprobeमुझे बताता है कि मुझे दो से गुणा करने की आवश्यकता नहीं है। फिर ffmpeg मुझे एक नंबर क्यों देता है जो कि लॉग्स में दोगुना बड़ा होता है जब यह परिवर्तित हो रहा होता है?
55फिंक

2
यह दृश्य interlaced है? यदि ऐसा है तो प्रति फ्रेम दो फ़ील्ड हैं, और यह आपको फ़ील्ड की संख्या दे सकता है।
stib

3

उबंटू पर परीक्षण किया गया।

melt icecap.mp4 -consumer xml
  • melt- melt को MLT फ्रेमवर्क के लिए एक परीक्षण उपकरण के रूप में माना गया था, लेकिन यह एक शक्तिशाली मल्टीटैक कमांड लाइन ओरिएंटेड वीडियो एडिटर भी है। यह ऑडियो और वीडियो फ़ाइलों के लिए एक न्यूनतर मीडिया प्लेयर के रूप में भी इस्तेमाल किया जा सकता है।

  • -consumerआईडी [: arg] [नाम = मान] *
    उपभोक्ता सेट करें (सिंक)

  • xml - xml स्वरूपित आउटपुट के लिए उपभोक्ता (सिंक) सेट करें

  • <property name="length">nnnn</property>- फ़्रेम की संख्या को दर्शाता है, जहां nnnnएक पूर्णांक संख्या द्वारा प्रतिस्थापित किया जाता है जो फ़्रेम की संख्या के बराबर होता है

यदि आपके पास पिघला नहीं है, तो आप इसे उबंटू और अन्य डेबियन आधारित सिस्टम पर स्थापित कर सकते हैं sudo apt-get install melt


1
यह बहुत छोटा है, क्या आप इसका विस्तार करना चाहते हैं कि यह क्या करता है, क्यों काम करता है, आदि?
डेविड

यह h264 mp4 फ़ाइलों पर अच्छी तरह से काम करता है जो फ्रैमकेाउंट के माध्यम से प्रदान नहीं करते हैं mediainfo -fullscan filename
एल्डर गीक

3

सीधे तौर पर mediainfo, कोई grep, कोई प्रतीक्षा नहीं, कुछ नहीं:

mediainfo --Inform='Video;%FrameCount%' $the_file

अन्य जानकारी के लिए देखें mediainfo --info-parameters


0

आप इसे ffprobe से प्राप्त मूल्यों को जोड़कर और गुणा करके कर सकते हैं।

नोट: ffprobe libav (avconv) का हिस्सा है - ffmpeg का लिनक्स संस्करण।

#your command -
 ffprobe man.avi

जब आप ऐसा करेंगे तो आपको प्रति सेकंड फ्रेम की संख्या और क्लिप की अवधि भी मिल जाएगी।

क्लिप की अवधि को दूसरे में और फ्रेम / सेकंड की संख्या से उस मान को गुणा करें।

संख्या को निकटतम करने के लिए याद रखें।


उबंटू में 14.04 एलटीएस ffprobeअनुपलब्ध है, लेकिन इसमें कुछ कहा जाता avprobeहै libav-tools(जो भी प्रदान करता है avconv)। लेकिन मेरी तरफ से यह किसी भी संख्या में फ़्रेम को प्रिंट नहीं करता है, कम से कम उन स्वरूपों के लिए जो मैंने कोशिश की थी। यह सिर्फ प्रिंट करता है, क्या avprobe -iप्रिंट करता है, और यह भी प्रारूप के बारे में कुछ मामूली बिट्स है, दुख की बात है। यहां तक ​​कि इसके साथ -v debugही मुझे मेरे हार्डवेयर और सॉफ़्टवेयर के कुछ अच्छे गुण बताए गए हैं, लेकिन जांच के लिए फ़ाइल / स्ट्रीम के बारे में दिलचस्प जानकारी का एक भी हिस्सा नहीं है। शायद यह विकल्पों में से कुछ में छिपा है जो उपलब्ध हैं। क्या पता?
टीनो

@Tino ffprobe वास्तव में ffmpeg पैकेज के हिस्से के रूप में उपलब्ध है। avconv ffmpeg का कांटा है और इससे कुछ भ्रम होता है। देखें: stackoverflow.com/questions/9477115/…
एल्डर गीक

@ElderGeek Ubuntu 14.04 LTS के ffmpegलिए आधिकारिक रिपॉजिटरी में कोई नहीं है। आपने जो लिंक दिया है, वह सही बताता है: FFmpeg ने Ubuntu 15.04 "विविड वर्वेट" में वापसी की। । हालाँकि स्थिति अब बदल गई है क्योंकि 16.04 LTS बाहर है।
टीनो

@ टिनो वास्तव में एक तथ्य है। हालाँकि, मैं रिपॉजिटरी में मौजूद नहीं होने के साथ अनुपलब्ध समान नहीं होगा। आप ध्यान दें कि यह ट्रस्टी (14.04) के लिए उपलब्ध है: ffmpeg.org/download.html
गीक


-2

सर्वोत्तम विधि: (सही मापदंडों की गणना करके प्रत्यक्ष, ffmpeg द्वारा पुष्टि)

सीएमडी ->

ffprobe.exe -v error -select_streams v:0 -show_entries stream=r_frame_rate,duration -of default=nw=1 "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4"

परिणाम ->

r_frame_rate=24000/1001
duration=8177.794625

गणना ->

Frames=24000/1001*8177.794625=196071 (exactly... ;P)

प्रमाण ->

ffmpeg -i "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4" -f 

null /dev/null
ffmpeg version N-92938-g0aaaca25e0-ffmpeg-windows-pacman Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.0 (GCC)
  configuration: --pkg-config=pkg-config --pkg-config-flags=--static --extra-version=ffmpeg-windows-pacman --enable-version3 --disable-debug --disable-w32threads --arch=x86_64 --target-os=mingw32 --cross-prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/bin/x86_64-w64-mingw32- --enable-libcaca --enable-gray --enable-libtesseract --enable-fontconfig --enable-gmp --enable-gnutls --enable-libass --enable-libbluray --enable-libbs2b --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-libmysofa --enable-libaom --enable-libopenjpeg --enable-libopenh264 --enable-liblensfun --enable-nvenc --enable-nvdec --extra-libs=-lm --extra-libs=-lpthread --extra-cflags=-DLIBTWOLAME_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCACA_STATIC --enable-amf --enable-libmfx --enable-gpl --enable-avisynth --enable-frei0r --enable-filter=frei0r --enable-librubberband --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-libxavs --enable-avresample --extra-cflags='-march=core2' --extra-cflags=-O2 --enable-static --disable-shared --prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32 --enable-nonfree --enable-decklink --enable-libfdk-aac
  libavutil      56. 25.100 / 56. 25.100
  libavcodec     58. 43.100 / 58. 43.100
  libavformat    58. 25.100 / 58. 25.100
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 47.100 /  7. 47.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'd:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
  Duration: 02:16:17.91, start: 0.000000, bitrate: 2497 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x800 [SAR 1:1 DAR 12:5], 2397 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
  Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to '/dev/null':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
    Stream #0:0(und): Video: wrapped_avframe, yuv420p, 1920x800 [SAR 1:1 DAR 12:5], q=2-31, 200 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.43.100 wrapped_avframe
    Stream #0:1(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
      encoder         : Lavc58.43.100 pcm_s16le

यहाँ

frame=196071 fps=331 q=-0.0 Lsize=N/A time=02:16:17.90 bitrate=N/A speed=13.8x

उत्पादन

video:102631kB audio:1408772kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
shareeditdeleteflag

मुझे r_frame_rate = 25/1 अवधि = N / A
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.