it-swarm.com.de

Wie bekomme ich die Videodauer in Sekunden?

Wie kann ich die Videodauer in Sekunden ermitteln?

Was ich versucht habe:

ffmpeg -i file.flv 2>&1 | grep "Duration"
  Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s


mediainfo file.flv | grep Duration
Duration : 39mn 43s

Das, was nahe kommt, aber es ist nicht so genau, 2383 ist 39,71 Minuten

ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed '[email protected]\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383
58
user2783132

Um Minuten zu erhalten, müssen Sie 2383 Sekunden durch 60 teilen.

39.7167

und multiplizieren Sie dann den Bruchteil .7167 mit 60, um die verbleibenden Sekunden zu erhalten.

43.002

Es sind also 39 Minuten und 43 Sekunden. Die Anwendung scheint Ihnen einen genauen Wert zu liefern.

33
Robert Harvey

Verwenden Sie einfach ffprobe direkt. sed, grep usw. sind nicht erforderlich. Sie können (abhängig von Ihrer Eingabe) mehrere "Dauern" festlegen.

Formatdauer (Container)

$ ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

30.024000

Durch Hinzufügen der Option -sexagesimal wird das Zeiteinheitsformat HOURS: MM: SS.MICROSECONDS verwendet:

0:00:30.024000

Dauer des Videostreams

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4
30.000000

Die obigen Befehle stammen aus FFmpeg Wiki: FFprobe Tips .

Mit ffmpeg

Möglicherweise müssen Sie die Eingabe vollständig dekodieren, wenn Sie feststellen, dass die Container- oder Stream-Dauer fehlt oder ungenau ist (möglicherweise aufgrund einer beschädigten oder abgeschnittenen Datei).

$ ffmpeg -i input.mp4 -f null -
  …
  frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

In diesem Beispiel ist time=00:01:03.48 die Dauer:

Wie lange dies dauern wird, hängt natürlich von der Dekodierungskomplexität und -dauer Ihrer Eingabe sowie von den Fähigkeiten Ihres Computers ab.

84
llogan

Wenn Sie ffmpeg haben, sollten Sie auch ffprobe haben:

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

Dies gibt auch Bruchteile von Sekunden. Wenn dies ein Problem ist, können Sie es mit sed weiterverarbeiten.

31
evilsoup

Lösung mit mplayer, der Sekunden direkt gibt:

mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'
3
micke

Um für mein ffmpeg-0.6.5-1.el6.rf.x86_64 nur das zweite ffprobe-Befehlsformat zu erhalten, gilt Folgendes:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 
2
Sunry
mediainfo --Output='General;%Duration%' file.flv

Dies gibt die Dauer in Millisekunden als einzelnen ganzzahligen Wert aus. Keine Notwendigkeit für grep/cut/sed/...

1
Josef Kufner

Ich bin auf das Problem gestoßen, dass einige Videodateien, mit denen ich gearbeitet habe, seltsame und inkorrekte Metadaten enthielten. Es gelang mir nicht, mithilfe von Code und Tools wie ffmpeg, mp4box, ffprobe, mediainfo, mplayer, um die tatsächliche Dauer des Videos abzurufen.

Das Ermitteln der tatsächlichen Dauer des Videos war eine Voraussetzung für ein Projekt, an dem ich gearbeitet habe. Die einzige Möglichkeit, die ich gefunden habe, um es immer richtig zu machen, bestand darin, die Videodatei mit ffmpeg neu zu codieren und codierte Dateien zu zwingen, die Metadaten der Originaldatei zu ignorieren.

ffmpeg -i INPUT_FILENAME -acodec copy -vcodec copy -map_metadata -1 OUTPUT_FILENAME"

(Dies läuft möglicherweise schneller als erwartet. Ich war überrascht, dass die durchschnittliche Zeit für die Art des Inhalts und die von mir verwendete Umgebung 2 Sekunden betrug.)

... und dann mit einem Werkzeug Ihrer Wahl die Dauer abrufen. Ich mag mediainfo, btw: - "mediainfo FILE --Inform =" Video;% Duration% "gibt die Dauer in Millisekunden an.

0
satirio