web-dev-qa-db-fra.com

Comment obtenir la durée de la vidéo en secondes?

Comment puis-je obtenir la durée de la vidéo en secondes?

Ce que j'ai essayé

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

Ce que près, mais ce n'est pas si précis, 2383 est 39,71 minutes

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

Pour obtenir des minutes, vous devez diviser 2383 secondes par 60.

39.7167

puis multipliez la partie décimale .7167 par 60 pour obtenir les secondes restantes.

43.002

Donc, c'est 39 minutes, 43 secondes. L'application semble vous donner une valeur exacte.

33
Robert Harvey

Utilisez simplement ffprobe directement. Pas besoin de sed, grep, etc. Il existe plusieurs "durées" que vous pouvez acquérir (en fonction de votre saisie).

Durée du format (conteneur)

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

30.024000

L'ajout de l'option -sexagesimal utilisera le format d'unité de temps HOURS: MM: SS.MICROSECONDS:

0:00:30.024000

Durée du flux vidéo

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

Les commandes ci-dessus proviennent de FFmpeg Wiki: FFprobe Tips .

Avec ffmpeg

Vous devrez peut-être complètement décoder l'entrée si vous trouvez que la durée du conteneur ou du flux est manquante ou inexacte (peut-être en raison d'un fichier endommagé ou tronqué).

$ 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

Dans cet exemple, time=00:01:03.48 est la durée:

La durée de cette opération dépendra bien sûr de la complexité du décodage, de la durée de votre saisie et des capacités de votre ordinateur.

84
llogan

Si vous avez ffmpeg, vous devriez également avoir ffprobe:

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

Cela donnera également des fractions de secondes. Si cela pose un problème, vous pouvez traiter plus avant avec sed.

31
evilsoup

Solution avec mplayer qui donne des secondes directement:

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

Pour mon ffmpeg-0.6.5-1.el6.rf.x86_64, pour obtenir seulement la seconde, le format de la commande ffprobe est:

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

Cela génère la durée en millisecondes sous forme de valeur entière unique. Pas besoin de grep/cut/sed/...

1
Josef Kufner

Je suis tombé sur le problème d'obtenir des métadonnées étranges et incorrectes à partir de fichiers vidéo avec lesquels je travaillais et je ne pouvais pas trouver de motif ni aucun type de traitement utilisant du code et des outils comme ffmpeg, mp4box, ffprobe, mediainfo, mplayer, pour obtenir la durée réelle de la vidéo.

Identifier la durée réelle de la vidéo était une exigence pour un projet sur lequel je travaillais et la seule façon de l'obtenir était de recoder le fichier vidéo à l'aide de ffmpeg et d'obliger les fichiers encodés à ignorer les métadonnées du fichier d'origine, comme par exemple:

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

(Cela risque de tourner plus vite que prévu. Le temps moyen était de 2 secondes, en raison du type de contenu et de l'environnement que j'utilisais.)

... et ensuite obtenir la durée en utilisant un outil de votre choix. J'aime mediainfo, en fait: - "mediainfo FILE --Inform =" Vidéo;% Durée% "vous donne la durée en millisecondes.

0
satirio