Comment vérifier combien de temps une vidéo (mp4) utilise le shell?

16

J'ai besoin de télécharger ftp tous les fichiers mp4 dans un répertoire d'une durée> 4 minutes en utilisant le shell. Je ne trouve aucun script pour vérifier la durée d'une vidéo. Quelqu'un sait-il comment faire cela?

Merci beaucoup!

Thomas
la source
1
voir ce stackoverflow.com/questions/3844430/… :-) espérons que cela aide
harish.venkat

Réponses:

23

Cela vous donnera la durée d'une vidéo.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
par
la source
Fonctionne également pour les URL vidéo à distance, par exemple ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | grep Durée | coupe -d '' -f 4 | sed s /, //
skidadon
Le format des messages du journal FFmpeg est-il garanti? Sinon, je n'aime pas trop ça - cela pourrait cesser de fonctionner avec n'importe quelle version.
Ondra Žižka
7

Mediainfo est un outil rapide à cet effet:

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

Vous pouvez trouver plus d'options dans une réponse plus approfondie .

Dans mes tests, ffprobeprend 0,3 seconde et mediainfo0,09 seconde.

qubodup
la source
Cela donne des résultats étranges ... comme 2679600 ... mieux à utiliser mediainfo --Inform="Video;%Duration/String%" [inputfile]... qui vous procurerait quelque chose comme 43 min 50s
Robert Riedl
5

Vous pouvez essayer d'utiliser la commande avconv ..

Vous devez d'abord installer:

Installer via le centre logiciel

si vous tapez la commande avec l'indicateur -i, vous obtiendrez des informations sur la vidéo:

avconv -i test.mp4

Dans la sortie, il y a un champ appelé Durée

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

Vous pouvez maintenant utiliser la commande pour obtenir uniquement la valeur du champ Durée

Type:

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

Dans mon cas, le résultat est:

00:58:28.05

58 minutes et 28,05 secondes.

J'espère que cela vous sera utile!

Roman Raguet
la source
1
Cela peut également être utilisé avec avprobe- pas besoin de la -i, mais cela fonctionne exactement de la même manière. Ou ffprobepour la réponse de @ per.
evilsoup
4

exiftool(initialement destiné à la lecture des métadonnées de l'appareil photo à partir de fichiers image, mais développé plus tard pour lire et écrire des métadonnées à partir de presque n'importe quel type de fichier multimédia) est très pratique à utiliser pour cela. Exécutez-le avec:

exiftool FILE.mp4 | grep Duration

Vous devrez probablement installer d' exiftoolabord, mais cela se fait facilement avec la commande suivante (sur Debian et les dérivés comme Ubuntu, etc.):

apt install libimage-exiftool-perl

Bien sûr, cette réponse n'est qu'une autre alternative. Beaucoup d'autres réponses sont également bonnes. :)

zrajm
la source
2

Encore plus simple:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
la source
Je reçois actuellement le message "L'option 'show_format_entry' est déconseillée, utilisez plutôt '-show_entries format = duration'"
Faheem Mitha
1

Ajout à solution pers , cela peut être utilisé sur un répertoire entier:

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

il peut même être étendu par | sortpour trier les fichiers selon leur longueur.

vous pouvez l'ajouter à .bashrcou .bash_aliasespour pouvoir le faire lsvlength | sortsur un répertoire

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'
mcnesium
la source
1

ffprobeest une solution plus élégante que celle ffmpegqui génère une erreur si elle ne reçoit pas le chemin de sortie.

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

Si vous souhaitez voir la durée de certaines vidéos dans un répertoire, vous pouvez utiliser la commande suivante

exiftool * | grep ^ Durée | coupe -d '' -f 26

meisamhakimi
la source
1
Pas besoin d'utiliser grepet autres. Tout simplement exiftool -T -Duration *.mkv(ou n'importe quel modèle de fichier)
PerlDuck
0

Comme vous pouvez le voir, il existe de nombreuses façons d'y parvenir. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONmediafile est le nom du fichier, fournira une sortie similaire à celle ci-dessous. Le premier étant la durée du premier flux (généralement vidéo) et le second fournissant la durée du second flux (généralement audio)

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Elder Geek
la source