Linux komut satırındaki videodaki kare sayısını nasıl bulurum?


30

Bir video dosyam var ve içinde bulunan video karelerinin sayısını almak istiyorum. ffmpegVideonun uzunluğu ve FPS'yi almak için kullanabilirim . Ancak toplam kare sayısı için belirgin bir şey göremiyorum.

Teoride kişi kare sayısını elde etmek için FPS ile uzunluğu (saniye olarak) çarpabilmelidir, ancak bu durumda uzunluk (34.43 saniye) ve kare hızı (29.97 fps) bana tam sayı vermez. Sanırım yanlış bir şey yapıyorum.

Bunu komut satırında tamamen otomatik ve grafiksel olmayan bir şekilde yapabilmem gerekiyor. Ayrıca, bunun kesin olarak kesin olmasına ve bir tahmin olmamasına da ihtiyacım var.

tcprobeBazı dosyalar üzerinde kullanmayı denedim . Bazı AVI dosyaları için çalışır, ancak bazı VOB dosyaları için, tcprobe çıktısı kare sayısına sahip değildir. Bu çıktıyı alıyorum:

[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]

denkleminiz size iyi bir basketbol sahası tahmini verecektir; Kayan pt sonucu kadar yuvarlak. Kesin sayıda kareye ihtiyacınız varsa, dosyayı doğrudan incelemeniz gerekir - video kod çözücünün özellikleri nedeniyle tahmininiz her iki yönde bir veya iki olabilir.
quix quixote

hepsi bir arada dosya VOB'leri veya DVD stili birden çok dosya VOB'ları nelerdir?
quix quixote

Yanıtlar:


17

Bu korkunç, aptal ve yavaş, ama iş gibi görünüyor:

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

Ayrıca kesilmiş dosyalarda ve ham akışlarda da çalışır (bu nedenle .vob dosyaları için hiçbir şey alamazsınız)


Bu oldukça iyi. Benim tecrübeme göre, o kadar uzun sürmez. Bir 40 dakikalık dosya olsa çalıştırmak için yaklaşık <3 saniye sürer. "^ M" nin 2 ve ^ karakter olmadığını hatırlayın, Control-V tuşuna basmanız ve sonra girmeniz gerekir. Komutun yerine kullandım: ffmpeg -i somefile.avi -vcodec copy -f rawvideo -y / dev / null 2> & 1 | tr "^ M" '\ n' | grep '^ frame =' | perl -pe 's / ^ çerçeve = \ s * ([0-9] +) \ s. * $ / \ 1 /' | tail -n 1 "frames ="
ifadesinden

1
Ubuntu 12.04 yılında ffmpeg versiyonu git-2013/04/15-a4f03f0, her iki atlayabilirsiniz | tr ^M '\n've |tail -n 1. Ayrıca, sonra boşluk frames=kalmaz. (Belki son dört yılda bir şeyler değişmiştir.)
Camille Goudeseune

benim için bu dönüş her zaman farklı değerler
CAMOBAP

1
Mediainfo çözümü VOB ile çalışıyor. Bunun yerine bunu tavsiye ederim. root @ lanparty: / mnt / filmler # mediainfo --fullscan Bugs_Bunny.vob | grep -i frame \ count Çerçeve sayısı: 175715 Çerçeve sayısı: 183218
kevinf

32

ffprobe Bir medya dosyası hakkında bilgi almak için kullanılabilir:

ffprobe -select_streams v -show_streams input.avi

Akış hakkında ayrıntılı bilgi alacaksınız:

nb_frames=159697

Arayın nb_framesile grep:

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

Bu avi, mp4 ve etc için çalışıyor. Bazı kaplar için geçerli bir değer göstermiyor, örneğin mpeg.

Bu durumda, bu çalışır ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l


İyi bir fikir. Komutu biraz değiştirdim, böylece yalnızca video akışını seçer ve çıkışı filtreler. Bu size sadece kare sayısını verir.
slhck

1
MPEG-2 ile çalışan 2. çözümünüz için tebrikler!
malat

1
MKV kapları ile çalışmaz.
Cenk Altı


İlk yaklaşımın VBR kodlu dosyalarda başarısız olduğu görülüyor. İkinci yaklaşım daha güvenilirdir.
Elder Geek

16

Bunu başka bir soruya gönderdim . tcprobeAracı kullanarak ( transcodepaketteki), çerçeve sayısı bilgiye dahil edilir. -iDosyadan bir bilgi dökümü almak için anahtarı kullanın :

$ 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

Kare sayısının burada iki satırda verildiğine dikkat edin (2. çıktı satırı ve son çıktı satırı).


Bu iyi bir cevap gibi görünüyor ve bazı dosyalar için çalışıyor, ancak sahip olduğum bazı VOB dosyaları için çıktıda o veri yok. Soruyu elde ettiğim çıktıyla güncelledim
Rory

bence tcprobe bu bilgi için dosya başlıklarını inceliyor (ama kesin olarak bilmiyorum). Başlıkta yer almıyorsa, tcprobe bunun için bir hesaplama yapmayabilir. iyi soru; Keşke senin için iyi bir cevabım olsaydı.
quack quixote

Bu VBR kodlu dosyalar üzerinde çalışıyor gibi gözükmüyor. Çözünürlük, en boy oranı ve kare hızı alıyorum.
Elder Geek

7

mediainfo --fullscan inputfile | grep "Frame count"Çoğu dosya için iyi çalıştığını buldum .

Debian tabanlı sistemler ile yükleyebilir apt-get install mediainfo

Çıktılardan biri yerine 2 satır alırsanız, ilk satır video, ikinci satır ise ses parçasıdır. Bunun Değişken Bit Hızı sesi olan dosyalarda gerçekleştiği anlaşılmaktadır.

Düzenleme tarihi itibariyle .mkv, .m4v, .mp4, flv, vob ve .avi örneklerinde test edilmiştir.

Kaynaklar: Video dosyası bilgileri Linux altındaki komut satırından nasıl alınır? ve Ubuntu tatları altında test edilir.

İşletim sisteminiz için mediainfo'yu burada bulabilirsiniz.


4

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

Süreyi ekleyin. Sed / awk ile meraklısı olabilir ve ne olmasın.

Testlerimizden şu an için en güvenilirinin en iyisini gösterdiğini söyleyebilirim. Kesin bir kare sayım ve tam bir süre elde edersiniz. Mediainfo gibi diğer tüm aletlerin gaga gibi göründüğü değişken kare hızlarında bile.


3

Kare sayısının aslında fps * süresinin iki katı olduğunu buldum (nedenini bilmiyorum, neden mutlu olacağımı bilmiyorum).

Benim bir senaryoda, var:

# 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)

Ve evet, nedense bunun tamsayı kısmını almam gerekiyor. Bu mantıklı gelmiyor, ancak bu komut her zaman videolarımı düzgün bir şekilde dönüştürmeyi her zaman başardı.


Çünkü FPS, Saniyedeki Kare Sayısı (veya ilk kişi atıcı: D) anlamına gelir ve 30 FPS varsa, videoda kaç saniye olduğunu çarpın.
John T,

Evet John, bunu çözebildim, ama bu doğru miktarda kareyi elde etmek için neden 2 ile çarpmam gerektiğini açıklamıyor ... Benim durumumda, karelerin miktarını hesapladıktan sonra, arka plan ve bir ilerleme çubuğu yapmak için günlükleri analiz etti. Günlükler dönüşümde kaç tane kare geçtiğini gösterir. Tüm video dönüştürüldükten sonra, kare # int (saniye * fps * 2), dolayısıyla kodum, ancak nedenini bilmek istiyorum ;-)
ℝaphink

bu meraklı; tcprobecevabım çıktı tam saniye * fps (yuvarlak up) olarak kare # verir. Sanırım bir tutam ffmpeg görüyorsun. Aynı sayıda kareyi gösterip göstermediklerini görmek için dosyayı diğer araçlarla analiz etmeyi denediniz mi?
quack quixote

Hmmm ... İlginç. Bir videoda denedim ve aldım seconds*fps=1001.59ve tcprobe=1002. Açıkçası, tcprobeiki ile çarpmam gerekmediğini söyledi. Öyleyse neden ffmpeg bana dönüştürme işleminde kayıtlarda iki kat daha büyük bir sayı veriyor?
Aralık’ta

2
titreşimli görüntüleri mi? Öyleyse, kare başına iki alan vardır ve size alan sayısını veriyor olabilir.
stib

3

Ubuntu'da test edilmiştir.

melt icecap.mp4 -consumer xml
  • melt- eritmek MLT çerçevesi için bir test aracı olarak düşünülmüştü, ancak aynı zamanda güçlü bir çok kanallı komut satırı yönelimli video editörüdür. Ayrıca ses ve video dosyaları için minimalist bir medya oynatıcı olarak da kullanılabilir.

  • -consumerid [: arg] [name = değer] *
    Tüketiciyi ayarlayın (lavabo)

  • xml - Tüketiciyi (lavabo) xml formatlı çıktı olarak ayarlayın

  • <property name="length">nnnn</property>- kare sayısını gösterir, burada kare nnnnsayısına eşit bir tam sayı ile değiştirilir.

Erime yapmazsanız, Ubuntu ve diğer Debian tabanlı sistemlere kurabilirsiniz. sudo apt-get install melt


1
Bu çok kısa, ne işe yaradığını, neden işe yaradığını vb.
David,

Bu, framecount üzerinden sağlamayan h264 mp4 dosyalarında iyi çalışır mediainfo -fullscan filename.
Elder Geek,

3

Direkt olarak mediainfo, grep yok, bekleme yok, hiçbir şey yok:

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

Diğer bilgiler için bkz. mediainfo --info-parameters


0

Bunu, ffprobe'den aldığınız değerleri ekleyerek ve çarparak yapabilirsiniz.

Not: ffprobe, favmpeg'in linux versiyonu olan libav'ın (avconv) bir parçasıdır.

#your command -
 ffprobe man.avi

Bunu yaptığınızda, saniye başına kare sayısını ve ayrıca klibin süresini alırsınız.

Klibin süresini saniyenin saniyesine dönüştürün ve bu değeri kare / saniye ile çarpın.

En yakın sayıya yuvarlamayı unutmayın.


Ubuntu'da 14.04 LTS ffprobekullanılamaz, ancak avprobeiçinde libav-toolsde denilen bir şey vardır avconv. Ancak yanımda, en azından denediğim formatlar için herhangi bir sayıda çerçeve basılmıyor. Sadece ne yazdırır, ne avprobe -iyazdırır, ve bu ne yazık ki, biçimiyle ilgili bazı küçük bitlerdir. Bununla birlikte -v debug, sadece yüklü donanım ve yazılımın bazı güzel özelliklerini gösterir, ancak araştırılacak dosya / akış hakkında tek bir ilginç bilgi vermez. Belki de mevcut sayısız seçeneklerden bazılarını gizler. Kim bilir?
Tino,

@Tino ffprobe, ffmpeg paketinin bir parçası olarak gerçekten kullanılabilir. avconv bir ffmpeg çatalı ve biraz karışıklığa neden oldu. Bakınız: stackoverflow.com/questions/9477115/…
Elder Geek

@ElderGeek Ubuntu 14.04 LTS ffmpegiçin resmi depolarda yoktur. Verdiğiniz bağlantı doğru şekilde belirtilmiş: FFmpeg Ubuntu 15.04 "Vivid Vervet" içinde geri döndü. . Ancak durum şimdi 16.04 LTS dışında değişti.
Tino

@Tino Bu gerçekten bir gerçek. Bununla birlikte, depolarda mevcut olmayanlarla eşit olmazdım. Burada Trusty ( 14.04
Elder Geek

0

linux

ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null

yakut

result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]

-2

En iyi yöntem: (Doğrudan doğru parametreleri hesaplayarak, ffmpeg tarafından onaylanan)

Cmd ->

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"

Sonuç ->

r_frame_rate=24000/1001
duration=8177.794625

Hesaplama ->

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

Kanıt ->

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

İşte

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

Çıktı

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

Elde r_frame_rate = 25/1 süresi = N / A
Yaşlı Geek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.