it-swarm.com.de

Bildanzahl mit ffmpeg abrufen

Weiß jemand, wie man mit ffmpeg die Gesamtbildanzahl aus einer Videodatei abruft? Die Renderausgabe von ffmpeg zeigt den aktuellen Frame und ich benötige die Frame-Anzahl, um den Fortschritt in Prozent zu berechnen.

74
Hansl

Hinweis: Das Vorhandensein einer Editierliste in MP4/M4V/M4A/MOV kann Ihre Frame-Nummer beeinflussen. Siehe Listen bearbeiten unten.


ffprobe: Fragt den Container ab

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
  • Dies ist eine schnelle Methode.
  • Nicht in allen Formaten (wie z. B. Matroska) wird die Anzahl der Frames angegeben, die zur Ausgabe von N/A führt. Siehe die anderen unten aufgeführten Methoden.

ffprobe: Zählen Sie die Anzahl der Frames

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
  • Dies ist eine langsame Methode.
  • Fügen Sie die Option -skip_frame nokey hinzu, um nur Keyframes zu zählen.

ffmpeg: Zähle die Anzahl der Frames

Wenn Sie ffprobe nicht haben, können Sie stattdessen ffmpeg verwenden:

ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
  • Dies ist eine etwas schnelle Methode.
  • Siehe frame= am Ende der Konsolenausgabe.
  • Fügen Sie die Eingabeoption -discard nokey (vor -i) hinzu, um nur Keyframes zu zählen.

Listen bearbeiten

Ignorieren Sie die Bearbeitungsliste MP4/M4V/M4A/MOV mit der Eingabeoption -ignore_editlist 1. Standardmäßig ist not die Bearbeitungsliste ignoriert.

Was bedeuten die ffprobe-Optionen?

  • -v error Dies verbirgt die "info" -Ausgabe (Versionsinfo usw.), wodurch das Analysieren vereinfacht wird.

  • -count_frames Zählen Sie die Anzahl der Frames pro Stream und melden Sie sie im entsprechenden Stream-Abschnitt.

  • -select_streams v:0 Wählen Sie nur den Videostrom aus.

  • -show_entries stream=nb_frames oder -show_entries stream=nb_read_frames Nur den Eintrag für nb_frames oder nb_read_frames anzeigen.

  • -of default=nokey=1:noprint_wrappers=1 Setzt das Ausgabeformat (auch "Writer" genannt) auf default, druckt nicht den Schlüssel jedes Feldes (nokey=1) und nicht die Kopf- und Fußzeile des Abschnitts (noprint_wrappers=1). Es gibt kürzere Alternativen wie -of csv=p=0.

Siehe auch


medieninformation

Das bekannte mediainfo-Tool kann die Anzahl der Frames ausgeben:

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

MP4Box

Für MP4/M4V/M4A-Dateien.

MP4Box von gpac kann die Anzahl der Frames anzeigen:

MP4Box -info input.mp4

Beziehen Sie sich auf die Zeile Media Info in der Ausgabe für den fraglichen Videostrom:

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

In diesem Beispiel hat der Videostrom 2525 Frames.


boxdumper

Für MP4/M4V/M4A/MOV-Dateien.

boxdumper ist ein einfaches Werkzeug von l-smash. Es wird eine große Menge an Informationen ausgegeben. Im Abschnitt stsz sample size finden Sie unter sample_count die Anzahl der Frames. In diesem Beispiel hat der Eingang 1900 Videoframes:

boxdumper input.mp4
  ...
  [stsz: Sample Size Box]
    position = 342641
    size = 7620
    version = 0
    flags = 0x000000
    sample_size = 0 (variable)
    sample_count = 1900
  • Beachten Sie, dass eine Datei mehrere stsz-Atome enthalten kann.
100
llogan

In Unix funktioniert das wie ein Zauber:

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

Berechnen Sie es stattdessen nach Zeit.

Das ist es, was ich mache, und es funktioniert für mich und viele andere.) Zuerst finden Sie die Länge des Videos im folgenden Ausschnitt:

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

Sie sollten in der Lage sein, Duration: hh:mm:ss.nn ständig und sicher zu finden, um die Größe des Quellvideoclips zu bestimmen. Für jede Aktualisierungszeile (CR, kein LF) können Sie dann den Text für die aktuelle Zeitmarke parsen, an der er sich befindet:

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    

Seien Sie einfach darauf bedacht, von diesen Statuszeilen nicht immer eine perfekte Ausgabe zu erwarten. Sie können Fehlermeldungen wie hier enthalten:

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    

Sobald Sie die Zeit haben, ist es einfach mathematisch: time / durration * 100 = % done.

13
Stu Thompson

Nicht in allen Formaten wird die Bildanzahl oder die Gesamtdauer gespeichert. Wenn dies der Fall ist, ist die Datei möglicherweise unvollständig. Daher erkennt ffmpeg beide nicht standardmäßig genau.

Versuchen Sie stattdessen, bis zum Ende der Datei zu suchen und die Uhrzeit zu lesen. Zählen Sie dann die aktuelle Uhrzeit.

Alternativ können Sie AVFormatContext->nb_index_entries oder die erkannte Dauer versuchen, die mindestens mit unbeschädigtem AVI/MOV funktionieren sollte, oder die Bibliothek FFMS2, die für eine Fortschrittsleiste wahrscheinlich zu langsam ist.

8
alex strange

Versuchen Sie etwas wie:

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

Es schreibt die Bildnummer in stderr, damit Sie das letzte Bild von diesem abrufen können.

8
a1kmm

Sie können ffprobe verwenden, um die Bildnummer mit den folgenden Befehlen zu erhalten

  1. erste Methode

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

die angeben, Daten im json-Format zu drucken

select_streams v weist ffprobe an, uns nur video-Streamdaten zu geben. Wenn Sie sie entfernen, erhalten Sie auch audio-Informationen

und die Ausgabe wird wie sein 

{
    "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 . Können Sie verwenden 

ffprobe -v error -show_format -show_streams video_name

wenn Sie ausgewählte Informationen wie die Bildrate anzeigen möchten, verwenden Sie den folgenden Befehl

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

wenn Sie diese Methode verwenden, besteht das Problem darin, dass Sie einen N/A als Ausgabe erhalten.

weitere Informationen finden Sie auf dieser Seite FFProbe Tips

7
Hadi Rasekh

versuche dies:

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

Das einzige, was ich tun konnte, ist folgendes:

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

So stellen Sie sicher, dass dies mit Video funktioniert:

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

auf die Antwort von stu bauen. So fand ich die Framerate für ein Video von meinem Handy. Ich habe den folgenden Befehl für eine Weile ausgeführt. Ich lasse die Bildzählung auf ca. ~ 10.000 steigen, bevor ich ungeduldig wurde und ^ C drückte:

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

dann habe ich mir zwei informationen aus dieser zeile geholt, die mit "frame =", der Bildanzahl 7989 und der Uhrzeit 00: 04: 26.30 beginnt. Sie müssen zuerst die Zeit in Sekunden umrechnen und dann die Anzahl der Frames in Sekunden teilen, um "Frames pro Sekunde" zu erhalten. "Frames pro Sekunde" ist Ihre Framerate.

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

7989/(4*60+26.3)
30.00000000000000000000
$

die Framerate für mein Video beträgt 30 fps.

2
margaret

Ich benutze die php_ffmpeg dann kann ich alle Zeiten und alle Frames eines Films bekommen. Als belows

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

Und dann ist das Detail auf der Seite.

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

1
xingyue

Entschuldigung für die Necro-Antwort, aber vielleicht brauche ich das (da ich für die letzten ffmpeg-Versionen keine Lösung gefunden habe.

Mit ffmpeg 3.3.4 habe ich folgendes gefunden:

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

Am Ende wird die Bildzählung ausgegeben. Es funktionierte für mich bei Videos mit Audio. Es gibt zwar zweimal eine "nb_frames" -Zeile, aber die erste Zeile war die tatsächliche Bildanzahl der getesteten Videos.

1
acidrums4
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
0
Gerard Wensink

In einer der Antworten wurde erwähnt, wie die Anzahl der Frames mit 'mediainfo' gezählt wird:

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

Wenn es sich bei der Eingabedatei um den elementaren Stream h264 handelt, meldet "mediainfo" nicht die Anzahl der Frames . Nur wenn die Eingabedatei ein Container ist (mp4, ts oder avi), wird die Anzahl der Frames gezählt und gemeldet. 

0