Weiß jemand, wie man mit ffmpeg die Anzahl der Frames 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.
Fügen Sie die -skip_frame nokeyOption hinzu, nur Keyframes zu zählen.
ffmpeg: Zähle die Anzahl der Frames
Wenn Sie nicht haben ffprobe, können Sie ffmpegstattdessen verwenden:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
Dies ist eine etwas schnelle Methode.
Siehe gegen frame=Ende der Konsolenausgabe.
Fügen Sie die -discard nokeyEingabeoption (vorher -i) hinzu, um nur Keyframes zu zählen.
Listen bearbeiten
Ignorieren Sie die Bearbeitungsliste MP4 / M4V / M4A / MOV mit der -ignore_editlist 1Eingabeoption. Standardmäßig wird die Bearbeitungsliste nicht ignoriert.
Was die ffprobe-Optionen bedeuten
-v error Dadurch wird die Ausgabe "info" (Versionsinfo usw.) ausgeblendet, was das Parsen erleichtert.
-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 Videostream aus.
-show_entries stream=nb_framesoder -show_entries stream=nb_read_framesNur den Eintrag für nb_framesoder anzeigen nb_read_frames.
-of default=nokey=1:noprint_wrappers=1Stellen Sie das Ausgabeformat (auch als "Writer" bezeichnet) auf ein default, drucken Sie nicht den Schlüssel jedes Felds ( nokey=1) und drucken Sie nicht die Kopf- und Fußzeile des Abschnitts ( noprint_wrappers=1). Es gibt kürzere Alternativen wie -of csv=p=0.
Das bekannte mediainfoTool 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 Media InfoZeile in der Ausgabe für den fraglichen Videostream:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
In diesem Beispiel hat der Videostream 2525 Frames.
Boxdumper
Für MP4 / M4V / M4A / MOV-Dateien.
boxdumperist ein einfaches Tool von l-smash. Es wird eine große Menge an Informationen ausgegeben. Unter dem stszFeld sample_countfür die Stichprobengröße finden Sie die Anzahl der Frames. In diesem Beispiel hat der Eingang 1900 Videobilder:
Oder, wenn Sie mehr Geschwindigkeit wollen und wenn nb_frames zuverlässig genug ist, vereinfachen Sie als:ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
Juanitogan
Dies gibt die Antwort zweimal für mich aus (dh 2600 \ n 2600). Gibt es einen bestimmten Grund dafür?
Jbodily
@jbodily Mein Beispiel oder Juanitogans? Ich kann es auch nicht duplizieren. Hier gibt es nicht viel zu arbeiten.
Llogan
+1, nicht zuletzt, weil im Gegensatz zu zu vielen anderen Antworten zu einem Befehlszeilen-Tool hier tatsächlich alle Befehlszeilenoptionen erläutert werden. Danke dir.
Ray
1
Beachten Sie, dass die erste Option, den Container abfragen, die Datei aufgrund von count_frames tatsächlich verarbeitet. Siehe @ juanitogans Kommentar.
Sie sollten in der Lage sein, Duration: hh:mm:ss.nndie Größe des Quellvideoclips konsistent und sicher zu bestimmen. Anschließend können Sie für jede Aktualisierungszeile (CR, kein LF) den Text für die aktuelle Zeitmarke analysieren, in der er sich befindet:
Entschuldigen Sie, dass ich dumm bin, aber wie kann ich Zeit / Dauer tun, wenn die Dauer im Format hh: mm: ss.nn und die Zeit immer im Format xx.yy ist?
Omar Ali
2
@Omar, Als .NET-Entwickler erstelle ich daraus ein TimeSpanund verwende es dann currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). Die TimeSpan bietet auch eine leistungsstarke Analysefunktion, probieren Sie es aus
Shimmy Weitzhandler
Hervorragende Lösung, meine Zeit ist in hh: mm: ss: ms, also nehme ich an, dass FFMPEG in diesen 3 Jahren das Ausgabezeitformat verbessert hat.
ElektroStudios
1
Beachten Sie, dass in der Konsolenausgabe möglicherweise 29,97 angezeigt wird, dies steht jedoch für 30000/1001. Gleiches gilt für 23,98 (24000/1001) und 59,94 (60000/1001).
Llogan
Hinweis: Dies funktioniert (offensichtlich) nicht für Videos mit variabler Framerate.
Timothy Zorn
8
Nicht alle Formate speichern ihre Frame-Anzahl oder Gesamtdauer - und selbst wenn dies der Fall ist, ist die Datei möglicherweise unvollständig -, sodass ffmpeg keines von beiden standardmäßig genau erkennt.
Versuchen Sie stattdessen, bis zum Ende der Datei zu suchen und die Uhrzeit zu lesen. Zählen Sie dann die aktuelle Uhrzeit, während Sie unterwegs sind.
Alternativ können Sie versuchen, AVFormatContext->nb_index_entriesdie erkannte Dauer, die bei mindestens unbeschädigtem AVI / MOV einwandfrei funktionieren sollte, oder die Bibliothek FFMS2, die wahrscheinlich zu langsam ist, um sich um einen Fortschrittsbalken zu kümmern.
Dies sollte schnell gehen, da keine Codierung durchgeführt wird. ffmpegwird einfach die Datei demuxen und den ersten Videostream so schnell wie möglich lesen (dekodieren). Der erste grepBefehl erfasst den Text, der den Rahmen zeigt. Der zweite grepBefehl erfasst nur die Nummer daraus. Der tailBefehl zeigt nur die letzte Zeile an (endgültige Frame-Anzahl).
auf stus Antwort aufbauen. So habe ich die Bildrate für ein Video von meinem Handy gefunden. Ich habe den folgenden Befehl für eine Weile ausgeführt. Ich ließ die Frame-Anzahl auf ungefähr 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 zwei Informationen aus dieser Zeile abgerufen, die mit "frame =" beginnen, der Frame-Anzahl 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. "Bilder pro Sekunde" ist Ihre Bildrate.
Ich habe Ihre Antwort positiv bewertet, aber das funktioniert nur, wenn das Video kein Audio enthält. Wenn es enthält, wird dieses funktionieren:ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe
2
Entschuldigen Sie die Nekro-Antwort, aber vielleicht brauchen Sie diese (da ich für die letzten ffmpeg-Versionen keine Lösung gefunden habe.
Am Ende wird die Frame-Anzahl ausgegeben. Bei Videos mit Audio hat es bei mir funktioniert. Es gibt zwar zweimal eine "nb_frames" -Zeile, aber die erste Zeile war die tatsächliche Frame-Anzahl der von mir getesteten Videos.
Die Framerate wird normalerweise aus zwei Parametern berechnet. r_frame_rate = 24000/1001 (= 23,97602397602397 ...) Abgerundet durch ffmpeg auf: 23,98 Dauer = Stunden * 3600 + Minuten * 60 + Sekunden. Rest = 8177,91 Während Dauer Parameter = 8177,794625 Aber Rahmen = 24000/1001 * 8177,794625 = 196071 gibt die genaue Anzahl der Frames an. (Im Ernst).
Antworten:
Hinweis: Das Vorhandensein einer Bearbeitungsliste in MP4 / M4V / M4A / MOV kann sich auf Ihre Bildnummer auswirken. Siehe Bearbeitungslisten unten.
ffprobe: Den Container abfragen
N/A
. Siehe die anderen unten aufgeführten Methoden.ffprobe: Zähle die Anzahl der Frames
-skip_frame nokey
Option hinzu, nur Keyframes zu zählen.ffmpeg: Zähle die Anzahl der Frames
Wenn Sie nicht haben
ffprobe
, können Sieffmpeg
stattdessen verwenden:frame=
Ende der Konsolenausgabe.-discard nokey
Eingabeoption (vorher-i
) hinzu, um nur Keyframes zu zählen.Listen bearbeiten
Ignorieren Sie die Bearbeitungsliste MP4 / M4V / M4A / MOV mit der
-ignore_editlist 1
Eingabeoption. Standardmäßig wird die Bearbeitungsliste nicht ignoriert.Was die ffprobe-Optionen bedeuten
-v error
Dadurch wird die Ausgabe "info" (Versionsinfo usw.) ausgeblendet, was das Parsen erleichtert.-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 Videostream aus.-show_entries stream=nb_frames
oder-show_entries stream=nb_read_frames
Nur den Eintrag fürnb_frames
oder anzeigennb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Stellen Sie das Ausgabeformat (auch als "Writer" bezeichnet) auf eindefault
, drucken Sie nicht den Schlüssel jedes Felds (nokey=1
) und drucken Sie 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:MP4Box
Für MP4 / M4V / M4A-Dateien.
MP4Box
von gpac kann die Anzahl der Frames anzeigen:Beziehen Sie sich auf die
Media Info
Zeile in der Ausgabe für den fraglichen Videostream:In diesem Beispiel hat der Videostream 2525 Frames.
Boxdumper
Für MP4 / M4V / M4A / MOV-Dateien.
boxdumper
ist ein einfaches Tool von l-smash. Es wird eine große Menge an Informationen ausgegeben. Unter demstsz
Feldsample_count
für die Stichprobengröße finden Sie die Anzahl der Frames. In diesem Beispiel hat der Eingang 1900 Videobilder:stsz
Atom haben kann.quelle
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
Unter Unix funktioniert dies wie ein Zauber:
quelle
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
Berechnen Sie es stattdessen anhand der Zeit.
Das ist, was ich tue und es funktioniert großartig für mich und viele andere.) Finden Sie zuerst die Länge des Videos im folgenden Ausschnitt:
Sie sollten in der Lage sein,
Duration: hh:mm:ss.nn
die Größe des Quellvideoclips konsistent und sicher zu bestimmen. Anschließend können Sie für jede Aktualisierungszeile (CR, kein LF) den Text für die aktuelle Zeitmarke analysieren, in der er sich befindet:Seien Sie nur vorsichtig, um nicht immer eine perfekte Ausgabe von diesen Statuszeilen zu erwarten. Sie können Fehlermeldungen wie hier enthalten:
Sobald Sie die Zeit haben, ist es einfach zu rechnen :
time / durration * 100 = % done
.quelle
TimeSpan
und verwende es danncurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. Die TimeSpan bietet auch eine leistungsstarke Analysefunktion, probieren Sie es ausNicht alle Formate speichern ihre Frame-Anzahl oder Gesamtdauer - und selbst wenn dies der Fall ist, ist die Datei möglicherweise unvollständig -, sodass ffmpeg keines von beiden standardmäßig genau erkennt.
Versuchen Sie stattdessen, bis zum Ende der Datei zu suchen und die Uhrzeit zu lesen. Zählen Sie dann die aktuelle Uhrzeit, während Sie unterwegs sind.
Alternativ können Sie versuchen,
AVFormatContext->nb_index_entries
die erkannte Dauer, die bei mindestens unbeschädigtem AVI / MOV einwandfrei funktionieren sollte, oder die Bibliothek FFMS2, die wahrscheinlich zu langsam ist, um sich um einen Fortschrittsbalken zu kümmern.quelle
Versuchen Sie etwas wie:
Es schreibt die Frame-Nummer in stderr, sodass Sie den letzten Frame daraus abrufen können.
quelle
ffprobe
Mit den folgenden Befehlen können Sie die Frame-Nummer abrufenffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
die sagen, Daten im
json
Format zu druckenselect_streams v
Sie werdenffprobe
aufgefordert, uns nurvideo
Stream-Daten zu geben. Wenn Sie diese entfernen, erhalten Sie auchaudio
Informationenund die Ausgabe wird wie sein
2. Sie können verwenden
Wenn Sie ausgewählte Informationen wie die Bildrate wünschen, verwenden Sie den folgenden Befehl
Wenn Sie diese Methode verwenden, ist es möglich, dass Sie eine
N/A
Ausgabe als erhalten.Weitere Informationen finden Sie auf dieser Seite. FFProbe-Tipps
quelle
Versuche dies:
quelle
*.ts
. Die Ausgabe ist eine leere Zeile.Da mein Kommentar ein paar positive Stimmen bekam, dachte ich, ich würde ihn als Antwort belassen:
Dies sollte schnell gehen, da keine Codierung durchgeführt wird.
ffmpeg
wird einfach die Datei demuxen und den ersten Videostream so schnell wie möglich lesen (dekodieren). Der erstegrep
Befehl erfasst den Text, der den Rahmen zeigt. Der zweitegrep
Befehl erfasst nur die Nummer daraus. Dertail
Befehl zeigt nur die letzte Zeile an (endgültige Frame-Anzahl).quelle
auf stus Antwort aufbauen. So habe ich die Bildrate für ein Video von meinem Handy gefunden. Ich habe den folgenden Befehl für eine Weile ausgeführt. Ich ließ die Frame-Anzahl auf ungefähr 10.000 steigen, bevor ich ungeduldig wurde und ^ C drückte:
Dann habe ich zwei Informationen aus dieser Zeile abgerufen, die mit "frame =" beginnen, der Frame-Anzahl 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. "Bilder pro Sekunde" ist Ihre Bildrate.
Die Framerate für mein Video beträgt 30 fps.
quelle
Das einzig genaue, was ich tun konnte, ist das Folgende:
So stellen Sie sicher, dass dies mit Video funktioniert:
quelle
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Entschuldigen Sie die Nekro-Antwort, aber vielleicht brauchen Sie diese (da ich für die letzten ffmpeg-Versionen keine Lösung gefunden habe.
Mit ffmpeg 3.3.4 habe ich Folgendes gefunden:
Am Ende wird die Frame-Anzahl ausgegeben. Bei Videos mit Audio hat es bei mir funktioniert. Es gibt zwar zweimal eine "nb_frames" -Zeile, aber die erste Zeile war die tatsächliche Frame-Anzahl der von mir getesteten Videos.
quelle
Ich benutze das php_ffmpeg, dann kann ich alle Zeiten und alle Bilder eines Films abrufen. Wie unten
Und dann ist das Detail auf der Seite.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
quelle
quelle
Linux
Rubin
quelle