Ffmpeg ile çerçeve sayısını getir


Yanıtlar:


158

Not: MP4 / M4V / M4A / MOV'da bir düzenleme listesinin varlığı çerçeve numaranızı etkileyebilir. Aşağıdaki Listeleri düzenleme konusuna bakın.


ffprobe: Kapsayıcıyı sorgulayın

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
  • Bu hızlı bir yöntemdir.
  • Tüm biçimler (Matroska gibi), çıktısıyla sonuçlanan kare sayısını bildirmez N/A. Aşağıda listelenen diğer yöntemlere bakın.

ffprobe: Çerçeve sayısını sayın

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
  • Bu yavaş bir yöntemdir.
  • -skip_frame nokeyYalnızca ana kareleri sayma seçeneğini ekleyin .

ffmpeg: Kare sayısını sayın

Eğer yoksa bunun yerine ffprobekullanabilirsiniz ffmpeg:

ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
  • Bu biraz hızlı bir yöntemdir.
  • frame=Konsol çıktısının sonuna yakın bir yere bakın .
  • Yalnızca ana kareleri saymak için -discard nokeygiriş seçeneğini (önce -i) ekleyin .

Listeleri düzenleyin

-ignore_editlist 1Giriş seçeneği ile MP4 / M4V / M4A / MOV düzenleme listesini yoksayın . Standart etmektir değil düzenleme listesini görmezden.

Ffprobe seçenekleri ne anlama geliyor?

  • -v error Bu, ayrıştırmayı kolaylaştıran "bilgi" çıktısını (sürüm bilgisi, vb.) Gizler.

  • -count_frames Akış başına kare sayısını sayın ve ilgili akış bölümünde bildirin.

  • -select_streams v:0 Yalnızca video akışını seçin.

  • -show_entries stream=nb_framesveya -show_entries stream=nb_read_framessadece girişini göster nb_framesveya nb_read_frames.

  • -of default=nokey=1:noprint_wrappers=1Çıktı formatını (diğer adıyla "yazar") olarak ayarlayın default, her alanın anahtarını ( nokey=1) yazdırmayın ve bölüm üstbilgisini ve altbilgisini ( noprint_wrappers=1) yazdırmayın . Gibi daha kısa alternatifler var -of csv=p=0.

Ayrıca bakın


medya bilgisi

İyi bilinen mediainfoaraç, kare sayısını verebilir:

mediainfo --Output="Video;%FrameCount%" input.avi

MP4Box

MP4 / M4V / M4A dosyaları için.

MP4Box gpac'den kare sayısını gösterebilir:

MP4Box -info input.mp4

Söz Media Infokonusu video akışı için çıktıdaki satıra bakın :

Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples

Bu örnekte, video akışı 2525 kareye sahiptir.


boxdumper

MP4 / M4V / M4A / MOV dosyaları için.

boxdumperl-smash'tan basit bir araçtır. Büyük miktarda bilgi verecektir. stszÖrnek boyut kutusu bölümü altında sample_countçerçeve sayısı için bakın . Bu örnekte, giriş 1900 video karesine sahiptir:

boxdumper input.mp4
  ...
  [stsz: Sample Size Box]
    position = 342641
    size = 7620
    version = 0
    flags = 0x000000
    sample_size = 0 (variable)
    sample_count = 1900
  • Bir dosyanın birden fazla stszatom içerebileceğini unutmayın .

5
Veya, daha fazla hız istiyorsanız ve nb_frames yeterince güvenilirse, şu şekilde basitleştirin:ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
juanitogan

Bu, cevabı benim için iki kez verir (yani 2600 \ n 2600). Olması gereken belirli bir sebep var mı?
jbodily

@jbodily Benim örneğim mi yoksa juanitogan'ın mı? İkisini de kullanarak kopyalayamıyorum. Burada çalışmak için fazla bir şey yok.
llogan

+1, çünkü herhangi bir komut satırı aracı hakkında çok sayıda diğer yanıtın aksine, bu aslında tüm komut satırı seçeneklerini açıklıyor. Teşekkür ederim.
Ray 18

1
İlk seçenek olan kapsayıcıyı sorgulamanın aslında say_frames nedeniyle dosyayı işlediğini unutmayın. @ Juanitogan'ın yorumuna bakın.
aggieNick02

24

Unix'te bu, çekicilik gibi çalışır:

ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

3
Gerçekten güzel. Ses akışını kopyalamanıza gerek yok. -Bir instat kullanabilirsiniz.
rekire

1
@PrakharMohanSrivastava Bu yanıtı
Antonio

4
Aslında, bu hızlı ve güvenilir görünüyor:ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Timothy Zorn

1
@Michael sabah kahvemle gülümsediğin için teşekkürler :-)
Lloyd Moore

1
@TimothyZorn Günümü sen yaptın!
Mladen Danic

13

Bunun yerine zamana göre hesaplayın.

Yaptığım şey bu ve benim ve diğerleri için harika çalışıyor.) İlk olarak, aşağıdaki kod parçacığında videonun uzunluğunu bulun:

Seems stream 0 codec frame rate differs from container frame rate: 5994.00 
(5994/1) -> 29.97 (30000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov':
  Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16
    Stream #0.2(eng): Data: tmcd / 0x64636D74

Duration: hh:mm:ss.nnKaynak video klibin boyutunu belirlemek için tutarlı ve güvenli bir şekilde bulabilmeniz gerekir. Daha sonra, her güncelleme satırı için (CR, LF yok), şu adresteki mevcut zaman işaretinin metnini ayrıştırabilirsiniz:

frame=   84 fps= 18 q=10.0 size=       5kB time=1.68 bitrate=  26.1kbits/s    
frame=   90 fps= 17 q=10.0 size=       6kB time=1.92 bitrate=  23.8kbits/s    
frame=   94 fps= 16 q=10.0 size=     232kB time=2.08 bitrate= 913.0kbits/s    

Bu durum satırlarından her zaman mükemmel çıktı beklememek için dikkatli olun. Aşağıdakiler gibi hata mesajları içerebilirler:

frame=   24 fps= 24 q=-1.0 size=       0kB time=1.42 bitrate=   0.3kbits/s    
frame=   41 fps= 26 q=-1.0 size=       0kB time=2.41 bitrate=   0.2kbits/s    
[h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in
sequential order
frame=   49 fps= 24 q=26.0 size=       4kB time=0.28 bitrate= 118.1kbits/s    
frame=   56 fps= 22 q=23.0 size=       4kB time=0.56 bitrate=  62.9kbits/s    

Vaktiniz sonra, basit matematik geçerli: time / durration * 100 = % done.


1
Aptal olduğum için kusura bakmayın ama süre ss: dd: ss.nn biçiminde ve zaman her zaman xx.yy biçiminde olduğunda zaman / süreyi nasıl yapabilirim?
Omar Ali

2
@Omar, Bir .NET devi olarak, ondan bir tane oluşturup TimeSpansonra kullanıyorum currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). TimeSpan ayrıca güçlü bir Ayrıştırma işlevi de sağlar, bir göz
atın

mükemmel çözüm, zamanım ss: dd: ss: ms cinsinden, bu yüzden bu 3 yılda FFMPEG'in çıktı zaman formatını iyileştirdiğini tahmin ediyorum.
ElektroStudios

1
Konsol çıktısının 29.97 diyebileceğini, ancak bunun 30000/1001 için kısa olduğunu unutmayın. 24000/1001 olan 23.98 ve 59.94 için de 60000/1001'dir.
llogan

Bir not olarak, bu değişken kare oranlı videolar için işe yaramaz (tabii ki).
Timothy Zorn

8

Tüm biçimler kare sayısını veya toplam süresini saklamaz - ve öyle olsalar bile dosya eksik olabilir - bu nedenle ffmpeg varsayılan olarak ikisini de doğru şekilde algılamaz.

Bunun yerine, dosyanın sonuna gitmeyi deneyin ve saati okuyun, ardından giderken geçerli saati sayın.

Alternatif olarak, AVFormatContext->nb_index_entriesen azından hasarsız AVI / MOV üzerinde çalışması gereken algılanan süreyi veya bir ilerleme çubuğu için muhtemelen çok yavaş olan kütüphane FFMS2'yi deneyebilirsiniz.


8

Şöyle bir şey dene:

ffmpeg -i "path to file" -f null /dev/null

Çerçeve numarasını stderr'e yazar, böylece son kareyi buradan alabilirsiniz.


8

ffprobe Aşağıdaki komutlarla çerçeve numarasını almak için kullanabilirsiniz

  1. ilk yöntem

ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v

veriyi yazdırmayı söyleyen json formatta

select_streams vffprobebize sadece videoakış verilerini vermenizi söyleyecek ve onu kaldırırsanız, sizeaudio bilgi de

ve çıktı şöyle olacak

{
    "streams": [
        {
            "index": 0,
            "codec_name": "mpeg4",
            "codec_long_name": "MPEG-4 part 2",
            "profile": "Simple Profile",
            "codec_type": "video",
            "codec_time_base": "1/25",
            "codec_tag_string": "mp4v",
            "codec_tag": "0x7634706d",
            "width": 640,
            "height": 480,
            "coded_width": 640,
            "coded_height": 480,
            "has_b_frames": 1,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "4:3",
            "pix_fmt": "yuv420p",
            "level": 1,
            "chroma_location": "left",
            "refs": 1,
            "quarter_sample": "0",
            "divx_packed": "0",
            "r_frame_rate": "10/1",
            "avg_frame_rate": "10/1",
            "time_base": "1/3000",
            "start_pts": 0,
            "start_time": "0:00:00.000000",
            "duration_ts": 256500,
            "duration": "0:01:25.500000",
            "bit_rate": "261.816000 Kbit/s",
            "nb_frames": "855",
            "nb_read_frames": "855",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            },
            "tags": {
                "creation_time": "2005-10-17 22:54:33",
                "language": "eng",
                "handler_name": "Apple Video Media Handler",
                "encoder": "3ivx D4 4.5.1"
            }
        }
    ]
}

2. kullanabilirsiniz

ffprobe -v error -show_format -show_streams video_name

size veri akışını sağlayacak, kare hızı gibi seçilmiş bilgileri istiyorsanız, aşağıdaki komutu kullanın

ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name

Bu, video bilgilerinize bir sayı temelini verir, sorun şu ki, bu yöntemi kullandığınızda bir N/A çıktı olarak .

daha fazla bilgi için bu sayfayı kontrol edin FFProbe İpuçları


4

bunu dene:

ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

İle çalışmıyor *.ts. Çıktı boş bir satırdır.
Victor Polevoy

3

Yorumum birkaç olumlu oy aldığından, bunu bir cevap olarak bırakacağımı düşündüm:

ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1

Kodlama yapılmadığından bu hızlı olmalıdır. ffmpegsadece dosyayı demux yapacak ve ilk video akışını olabildiğince çabuk okuyacaktır (kodunu çözecektir). İlk grepkomut, çerçeveyi gösteren metni alacaktır. İkinci grepkomut bundan sadece sayıyı alacaktır. tailKomut sadece son çizgiyi (son kare sayısı) gösterecektir.


2

stu'nun cevabını geliştirmek için. Cep telefonumdaki bir videonun kare hızını şu şekilde buldum. Bir süre aşağıdaki komutu çalıştırdım. sabırsızlanıp ^ C'ye basmadan önce kare sayısının ~ 10.000'e çıkmasına izin verdim:

$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0    
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$

sonra, "kare =", kare sayısı, 7989 ve saat 00: 04: 26.30 ile başlayan bu satırdan iki bilgi aldım. "Saniyedeki kare sayısı" değerini elde etmek için önce zamanı saniyeye dönüştürmeniz ve ardından kare sayısını saniyeye bölmeniz gerekir. "saniyedeki kare sayısı" kare hızınızdır.

$ bc -l
0*60*60 + 4*60 + 26.3
266.3

7989/(4*60+26.3)
30.00000000000000000000
$

videomun kare hızı 30 fps.


2

Bunu yapabildiğim tek doğru şey şudur:

ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'

Bunun videoyla çalıştığından emin olmak için:

ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video

Cevabınıza olumlu oy verdim, ancak bu yalnızca videoda ses yoksa işe yarar. Eğer içeriyorsa, bu çalışacaktır:ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe

2

Necro cevabı için özür dilerim, ama belki buna ihtiyacım olacak (çünkü son ffmpeg sürümleri için bir çözüm bulamadım.

Ffmpeg 3.3.4 ile aşağıdakilerin bulunabileceğini buldum:

ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"

Sonunda, kare sayısını çıkaracaktır. Benim için sesli videolarda çalıştı. Yine de iki kez "nb_frames" satırı veriyor, ancak ilk satır, test ettiğim videolardaki gerçek kare sayısıydı.


Teşekkürler @ acidrums4. Doğrulandı bu yöntem, bugün oluşturduğum github'un en son sürümüyle çalışıyor.
Paul J

1

Php_ffmpeg kullanıyorum, o zaman bir filmin tüm zamanlarını ve tüm karelerini alabilirim. Belows gibi

$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
    echo $ffmpegObj->getFrameCount();

Ve sonra detay sayfada.

http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php


1
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"

Result ->

r_frame_rate=24000/1001
duration=8177.794625

Calculation ->

Frames=24000/1001*8177.794625=196071

Proof -> 

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

Kare hızı normalde iki parametreden hesaplanır. r_frame_rate = 24000/1001 (= 23,97602397602397 ...) ffmpeg ile yuvarlanır: 23.98 Süre = saat * 3600 + dakika * 60 + saniye. geri kalan = 8177,91 Süre parametresi = 8177.794625 Ama Çerçeveler = 24000/1001 * 8177.794625 = 196071 tam çerçeve sayısını verir. (Şaka yapmıyorum).
Gerard Wensink

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