Ich habe eine Videodatei und möchte die Anzahl der darin enthaltenen Videoframes ermitteln. Ich kann verwenden ffmpeg
, um die Länge des Videos und die FPS zu erhalten. Allerdings sehe ich für die Gesamtzahl der Frames nichts Offensichtliches.
Theoretisch sollte man in der Lage sein, die Länge (in Sekunden) mit der FPS zu multiplizieren, um die Anzahl der Frames zu erhalten, aber in diesem Fall geben die Länge (34,43 Sekunden) und die Framerate (29,97 fps) eine Nicht-Ganzzahl an, was mich zu einer Zahl macht denke, ich mache etwas falsch.
Ich muss in der Lage sein, dies in der Befehlszeile auf eine vollständig automatisierte und nicht grafische Weise zu tun. Ich brauche das auch, um ziemlich genau zu sein und keine Schätzung (wenn das überhaupt mit Videodateien möglich ist)
Ich habe versucht, tcprobe
auf einige Dateien zu verwenden. Für einige AVI-Dateien funktioniert es, aber für einige VOB-Dateien hat die Ausgabe von tcprobe nicht die Anzahl der Frames. Ich bekomme diese Ausgabe:
[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
aspect ratio: 4:3 (*)
frame rate: -f 29.970 [25.000] frc=4 (*)
PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
PTS=2199.2763, bitrate=192 kbps
-D 3 --av_fine_ms 20 (frames & ms) [0] [0]
Antworten:
Das ist schrecklich und dumm und langsam, scheint aber zu funktionieren:
Es funktioniert auch direkt bei abgeschnittenen Dateien und RAW-Streams (daher erhalten Sie für VOB-Dateien nichts).
quelle
| tr ^M '\n'
und weglassen|tail -n 1
. Auch kein Leerzeichen danachframes=
scheitert nicht. (Vielleicht hat sich in den letzten vier Jahren etwas geändert.)ffprobe
kann verwendet werden, um Informationen zu einer Mediendatei abzurufen:Sie erhalten Details zum Stream:
Suchen Sie
nb_frames
mitgrep
:Das funktioniert für avi, mp4 und etc. Bei einigen Containern wird kein gültiger Wert angezeigt, z. B. mpeg.
In diesem Fall funktioniert dies
ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l
quelle
Ich habe dies auf einer anderen Frage gepostet . Mit dem
tcprobe
Tool (aus demtranscode
Paket) ist die Anzahl der Frames in der Info enthalten. Verwenden Sie den-i
Schalter, um einen Info-Dump aus der Datei abzurufen:Beachten Sie, dass die Anzahl der Frames hier in zwei Zeilen angegeben ist (2. Ausgabezeile und letzte Ausgabezeile).
quelle
Ich habe festgestellt, dass das
mediainfo --fullscan inputfile | grep "Frame count"
für die meisten Dateien gut funktioniert.Debian-basierte Systeme können es mit installieren
apt-get install mediainfo
Wenn Sie 2 Zeilen anstatt einer Ausgabe erhalten, ist die erste Zeile die Videospur und die zweite Zeile die Audiospur. Dies scheint bei Dateien mit variabler Bitrate der Fall zu sein.
Getestet auf .mkv-, .m4v-, .mp4-, flv-, vob- und .avi-Samples zum Zeitpunkt der Bearbeitung.
Quellen: Wie kann man unter Linux Informationen zu Videodateien von der Kommandozeile abrufen? und Testen unter Ubuntu-Aromen.
Hier finden Sie mediainfo für Ihr Betriebssystem .
quelle
Addieren Sie die Dauer. Könnte mit sed / awk schicker sein und was nicht.
Aus unseren Tests kann ich sagen, dass es sich vorerst als das zuverlässigste erwiesen hat. Sie erhalten eine genaue Framecount und genaue Dauer. Selbst mit variabler Framerate scheinen alle anderen Tools wie mediainfo gaga zu werden.
quelle
Ich habe festgestellt, dass die Anzahl der Frames tatsächlich doppelt so groß ist wie die fps * -Dauer (keine Ahnung warum, ich würde es gerne wissen).
In einem Skript von mir habe ich:
Und ja, aus irgendeinem Grund muss ich den ganzzahligen Teil davon bekommen. Es macht keinen Sinn, aber dieses Skript hat es bisher immer geschafft, meine Videos richtig zu konvertieren.
quelle
tcprobe
Ausgabe in meiner Antwort gibt die Anzahl der Frames in Sekunden * fps (aufgerundet) an. Ich gehe davon aus, dass Sie eine Eigenart von ffmpeg sehen. Haben Sie versucht, die Datei mit anderen Tools zu analysieren, um festzustellen, ob sie die gleiche Anzahl von Frames enthält?seconds*fps=1001.59
undtcprobe=1002
. Also,tcprobe
sagt mir, dass ich nicht mit zwei multiplizieren muss. Warum gibt mir ffmpeg dann eine doppelt so große Zahl in den Protokollen, wenn es konvertiert?Getestet auf Ubuntu.
melt
- melt war als Testwerkzeug für das MLT-Framework gedacht, ist aber auch ein leistungsfähiger, auf mehrere Spuren basierender, befehlszeilenorientierter Videoeditor. Es kann auch als minimalistischer Mediaplayer für Audio- und Videodateien verwendet werden.-consumer
id [: arg] [name = value] *Setzt den Consumer (sink)
xml
- Setzen Sie den Consumer (Senke) auf eine XML-formatierte Ausgabe<property name="length">nnnn</property>
- Zeigt die Anzahl der Frames an, wobei diesennnn
durch eine Ganzzahl ersetzt wird, die der Anzahl der Frames entsprichtWenn Sie kein Melt haben, können Sie es auf Ubuntu und anderen Debian-basierten Systemen mit installieren
sudo apt-get install melt
quelle
mediainfo -fullscan filename
.Direkt mit
mediainfo
, kein Grep, kein Warten, kein Nichts:Weitere Informationen finden Sie unter
mediainfo --info-parameters
quelle
Sie können dies tun, indem Sie die Werte, die Sie von ffprobe erhalten, addieren und multiplizieren.
Hinweis: ffprobe ist Teil von libav (avconv) - der Linux-Version von ffmpeg.
Wenn Sie dies tun, erhalten Sie die Anzahl der Bilder pro Sekunde und auch die Dauer des Clips.
Konvertieren Sie die Dauer des Clips in Sekunden und multiplizieren Sie diesen Wert mit der Anzahl der Bilder / Sekunde.
Denken Sie daran, die Zahl auf die nächste aufzurunden.
quelle
ffprobe
ist nicht verfügbar, aber es ist etwas , genanntavprobe
inlibav-tools
(was bietet auchavconv
). Aber an meiner Seite werden keine Frames gedruckt, zumindest nicht für die Formate, die ich ausprobiert habe. Es wird nur gedruckt, was auchavprobe -i
gedruckt wird, und das sind leider nur ein paar Kleinigkeiten über das Format. Auch-v debug
wenn es mir nur ein paar nette Eigenschaften meiner installierten Hardware und Software verrät, gibt es keine interessanten Informationen über die zu prüfende Datei / den Stream. Vielleicht verbirgt es sich in einigen der unzähligen verfügbaren Optionen. Wer weiß?ffmpeg
in den offiziellen Repositories. Der Link, den Sie korrekt angegeben haben, besagt, dass FFmpeg in Ubuntu 15.04 "Vivid Vervet" zurückgegeben wurde. . Die Situation hat sich jedoch geändert, da 16.04 LTS aus ist.Linux
Rubin
quelle
Beste Methode: (Direkt durch Berechnung der richtigen Parameter, bestätigt durch ffmpeg)
Befehl ->
Ergebnis ->
Berechnung ->
Beweis ->
Hier
Ausgabe
quelle