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
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.
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).
$ 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
$ 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 .
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.
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.
Solution avec mplayer qui donne des secondes directement:
mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'
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'
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/...
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.