[Video] Framegröße mit ffmpeg holen


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

Kann jemand die Anzahl der gesamten Bilder aus einer Videodatei mit ffmpeg abrufen? Die Render-Ausgabe von ffmpeg zeigt den aktuellen Frame an und ich brauche die Frame-Anzahl, um den Fortschritt in Prozent zu berechnen.




Sie können ffprobe , um die ffprobe 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

welche sagen, Daten im json Format zu drucken

select_streams v ffprobe mit, dass es uns nur video Daten geben soll und wenn Sie es entfernen, erhalten Sie auch audio

und die Ausgabe wird ähnlich 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. Sie können verwenden

ffprobe -v error -show_format -show_streams video_name

Wenn Sie ausgewählte Daten wie Bildrate wünschen, 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 Anzahl von Basis auf Ihre Video-Informationen, das Problem ist, wenn Sie diese Methode verwenden, ist es möglich, Sie erhalten eine N/A als Ausgabe.

Weitere Informationen finden Sie auf dieser Seite FFProbe-Tipps




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

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

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




auf stus Antwort aufbauen. Hier ist, wie ich die Bildrate für ein Video von meinem Handy gefunden habe. Ich habe den folgenden Befehl eine Weile ausgeführt. Ich lasse die Bildzählung auf ungefähr ~ 10.000 ansteigen, bevor ich ungeduldig wurde 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 dieser Zeile genommen, die mit "frame =", der Frame-Anzahl, 7989 und der Uhrzeit 00: 04: 26.30 beginnen. Sie müssen zuerst die Zeit in Sekunden umwandeln und dann die Anzahl der Frames durch Sekunden teilen, um "Frames pro Sekunde" zu erhalten. "Bilder 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.




Linux

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

Rubin

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



Ich benutze den php_ffmpeg, dann kann ich alle Zeiten und alle Bilder eines Films bekommen. Wie unten

$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






Links