[Video] Frame-Anzahl mit ffmpeg abrufen


Answers

In Unix funktioniert das wie Charme:

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

Weiß jemand, wie man mit ffmpeg die Anzahl der gesamten Frames aus einer Videodatei holt? Die Renderausgabe von ffmpeg zeigt den aktuellen Frame an und ich benötige die Framezahl, um den Fortschritt in Prozent zu berechnen.




Das einzige, was ich genau konnte, ist das Folgende:

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

Um sicherzustellen, dass dies mit Video funktioniert:

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



Sie können ffprobe , um die Rahmennummer 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 sagen, um Daten im json Format zu drucken

select_streams v wird ffprobe , uns lediglich video Stream-Daten zu geben, und wenn Sie es entfernen, erhalten Sie auch audio Informationen.

und die Ausgabe wird wie

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

ffprobe -v error -show_format -show_streams video_name

die Ihnen Stream-Daten liefert, wenn Sie ausgewählte Informationen wie Frame-Rate wollen, 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

die geben eine Zahlenbasis auf Ihre Video-Informationen, das Problem ist, wenn Sie diese Methode verwenden, ist es möglich, dass Sie eine N/A als Ausgabe erhalten.

Für weitere Informationen siehe diese Seite FFProbe Tipps




auf stu's antwort aufbauen. hier ist, wie ich die Framerate für ein Video von meinem Handy gefunden habe. Ich habe den folgenden Befehl für eine Weile ausgeführt. Ich lasse die Frame-Anzahl auf ungefähr ~ 10.000 steigen, bevor ich ungeduldig werde und auf ^ C stoße:

$ 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 zwei informationen aus der zeile gezogen, die mit "frame =" beginnt, der frame count, 7989, und der zeit, 00: 04: 26.30. Sie müssen zuerst die Zeit in Sekunden umrechnen und dann die Anzahl der Bilder durch Sekunden teilen, um "Bilder pro Sekunde" zu erhalten. "Frames pro Sekunde" ist Ihre Bildrate.

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




Nicht alle Formate speichern ihre Frame-Anzahl oder die Gesamtdauer - und selbst wenn dies der Fall ist, ist die Datei möglicherweise unvollständig - daher erkennt ffmpeg sie standardmäßig nicht genau.

Stattdessen versuchen Sie, bis zum Ende der Datei zu suchen und die Uhrzeit abzulesen, und zählen Sie dann die aktuelle Uhrzeit, während Sie gehen.

Alternativ können Sie versuchen, AVFormatContext->nb_index_entries oder die erkannte Dauer, die auf mindestens unbeschädigtem AVI / MOV funktionieren sollte, oder die Bibliothek FFMS2, die wahrscheinlich zu langsam ist, um sich für einen Fortschrittsbalken zu kümmern.