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


70

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

Réponses:


36

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.


97

Il suffit d'utiliser ffprobedirectement. Pas besoin de sed, grepetc. 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' -sexagesimaloption 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 (probablement 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.48est 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.


Ceux-ci ne fonctionnent pas pour les fichiers .m2v avez-vous une solution pour les
résoudre?

@utdev Voir la ffmpegsection "Avec ".
Llogan

Votre troisième solution me donne un mauvais moment, ma vidéo a une longueur de 01:19:00 mais la commande me renvoie le temps = 01: 09: 15.32, avez-vous une idée du pourquoi cela se produit
utdev

Très utile la durée du flux média. Je vous remercie.
Nous sommes Borg

Pour ceux qui utilisent avprobe, les paramètres sont légèrement différents: avprobe -v erreur -show_format_entry duration. \ Sample.mp4
Brad

33

Si vous en avez ffmpeg, vous devriez aussi 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.


Comment puis-je supprimer la fraction de seconde?
Tina J

@TinaJ Il suffit de le diriger avec printf, comme | xargs printf %.0f- cela retournera une valeur entière.
Ilia Rostovtsev

3

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

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 

Comment puis-je supprimer la fraction de seconde?
Tina J

3

Solution avec mplayer qui donne des secondes directement:

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

2
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 / ...


Merci - c'était juste ce que je cherchais. Peut être installé sur MacOS avecbrew install mediainfo
Alex K

0

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, d'ailleurs: - "mediainfo FILE --Inform =" Vidéo;% Durée% "vous donne la durée en millisecondes.


Vous n'avez pas fourni plus d'informations ni de meilleure solution que d'autres réponses
Sam

0

Si vous avez seulement besoin d'interroger les métadonnées:

ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4

[...]

streams.stream.0.duration="5221.146009"

[...]

Pour que vous puissiez l'analyser:

while read -r; do
  if [[ "$REPLY" =~ ^streams\.stream\.([0-9])+\.duration=\"([^"]+)\"$ ]]; then
    echo -E Duration of stream "${BASH_REMATCH[1]}": "${BASH_REMATCH[2]}"
  fi
done < <(ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4)

Mais si vous voulez obtenir la durée effective du conteneur, vous devez le décoder:

AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2

Il faudra un peu de temps CPU pour le décoder, jusqu'à ce que:

[...]

frame=130527 fps=53271 q=-1.0 Lsize=N/A time=01:27:01.12 bitrate=N/A speed=2.13e+03x
video:152014kB audio:40790kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

Ensuite, vous pouvez l'analyser:

if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
  declare duration=0 us="${BASH_REMATCH[4]}" t
  for t in "${BASH_REMATCH[@]:1:3}"; do
    ((duration *= 60))
    ((duration += ${t#0} ))
  done
  while [ ${#us} -lt 6 ]; do us+=0; done
  ((us >= 500000)) && ((duration++))
  ((duration)) || ((duration++))
fi
echo -E Duration: "$duration"

-6

Si vous voulez une durée exacte, oubliez FFmpeg. Il ne donne qu'une estimation basée sur la taille du fichier et le débit moyen. J'ai trouvé, dans certains cas, la durée estimée par 2x!

Sous Linux, si le fichier est créé et modifié uniquement pendant ledit enregistrement vidéo, une autre solution consisterait à utiliser la création et la dernière heure de modification pour calculer la durée, comme dans:

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'

5
Où avez-vous trouvé que ffmpeg est inexact?
aleb

4
% X est l'heure du dernier accès. % Y est le temps depuis la dernière modification. Cela ne dit rien sur la longueur de la vidéo.
Joe Hillenbrand

1
Cela semble être un troll
George Chalhoub
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.