Wie überprüfe ich, wie lange ein Video (mp4) die Shell benutzt?

16

Ich muss per FTP alle mp4-Dateien in ein Verzeichnis mit einer Länge von> 4 Minuten über die Shell hochladen. Ich kann kein Skript finden, um die Länge eines Videos zu überprüfen. Hat jemand eine Idee, wie man das macht?

Vielen Dank!

Thomas
quelle
1
siehe hierzu stackoverflow.com/questions/3844430/… :-) hoffe das hilft
harish.venkat

Antworten:

23

Dies gibt Ihnen die Länge eines Videos.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
pro
quelle
Funktioniert auch für Remote-Video-URLs, z. B. ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | grep Duration | cut -d '' -f 4 | sed s /, //
Skidadon
Ist das FFmpeg-Protokollnachrichtenformat garantiert? Wenn nicht, mag ich das nicht sehr - es könnte aufhören, mit irgendeiner Veröffentlichung zu arbeiten.
Ondra Žižka
7

Mediainfo ist ein schnelles Werkzeug für diesen Zweck:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

Weitere Optionen finden Sie in einer ausführlicheren Antwort .

In meinen Tests ffprobedauert 0,3 Sekunden und mediainfodauert 0,09 Sekunden.

qubodup
quelle
Dies gibt seltsame Ergebnisse ... wie 2679600 ... besser zu verwenden mediainfo --Inform="Video;%Duration/String%" [inputfile]... die Ihnen etwas wie 43 min 50s bekommen würde
Robert Riedl
5

Sie können versuchen, den Befehl avconv zu verwenden .

Zuerst sollten Sie installieren:

Installation über das Software Center

Wenn Sie den Befehl mit dem Flag -i eingeben, erhalten Sie Informationen zum Video:

avconv -i test.mp4

In der Ausgabe gibt es ein Feld namens Duration

avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Nov  6 2012 16:51:33 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':

  Duration: 00:58:28.05, start: 0.000000, bitrate: 888 kb/s
    Stream #0.0(eng): Video: h264 (High), yuv420p, 720x404, 748 kb/s, 25 fps, 25 tbr, 20k tbn, 50 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s

Jetzt können Sie den Befehl verwenden, um nur den Wert des Feldes Duration abzurufen

Art:

avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//

In meinem Fall ist das Ergebnis:

00:58:28.05

58 Minuten und 28.05 Sekunden.

Hoffe das wird hilfreich!

Roman Raguet
quelle
1
Dies kann auch verwendet werden , wenn avprobe- nicht erforderlich -i, aber ansonsten funktioniert es genauso. Oder ffprobefür @Pers Antwort.
Übelsuppe
4

exiftool(Ursprünglich zum Lesen von Kamerametadaten aus Bilddateien gedacht, aber später zum Lesen und Schreiben von Metadaten aus fast jeder Art von Mediendatei erweitert) ist dies sehr praktisch. Führen Sie es mit:

exiftool FILE.mp4 | grep Duration

Sie müssen wahrscheinlich exiftoolzuerst installieren , aber dies ist einfach mit dem folgenden Befehl (unter Debian und Derivaten wie Ubuntu usw.) durchzuführen:

apt install libimage-exiftool-perl

Natürlich ist diese Antwort nur eine andere Alternative. Viele der anderen Antworten sind auch gut. :)

zrajm
quelle
2

Noch einfacher:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
quelle
Ich erhalte derzeit die Meldung "Option 'show_format_entry' ist veraltet, verwenden Sie stattdessen '-show_entries format = duration'"
Faheem Mitha
1

Zusätzlich zu pers Lösung , kann dies auf ein ganzes Verzeichnis verwendet werden:

for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done

Es kann sogar erweitert werden | sort, um die Dateien nach ihrer Länge zu sortieren.

Sie können dies zu .bashrcoder hinzufügen, um dies in einem Verzeichnis .bash_aliasestun zu können lsvlength | sort

alias lsvlength='for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done'
Magnesium
quelle
1

ffprobeist eine elegantere Lösung, als ffmpegdie einen Fehler auslöst, wenn der Ausgabepfad nicht angegeben wird.

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Ondra Žižka
quelle
0

Wenn Sie die Dauer einiger Videos in einem Verzeichnis anzeigen möchten, können Sie den folgenden Befehl verwenden

exiftool * | grep ^ Duration | cut -d '' -f 26

Meisamhakimi
quelle
1
Keine Notwendigkeit zu benutzen grepund so. Einfach exiftool -T -Duration *.mkv(oder was auch immer
Dateimuster
0

Wie Sie sehen, gibt es zahlreiche Möglichkeiten, dies zu erreichen. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONwo Mediadatei ist der Name der Datei, wird eine Ausgabe ähnlich der unten bieten. Das erste ist die Dauer des ersten Streams (normalerweise Video) und das zweite die Dauer des zweiten Streams (normalerweise Audio).

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Elder Geek
quelle