Obtenez la longueur MP3 sous Linux / FreeBSD

27

J'ai un tas de fichiers mp3 de différentes longueurs. Je veux le réduire à une longueur de 50% à 60%. Dit, de 1 minute à 30 secondes. Cela devrait être trivial en utilisant ffmpeg. Mais, je ne sais pas comment en déterminer la longueur d'origine comme base de traitement à l'aide de ffmpeg.

Quelqu'un a une idée?

ariefbayu
la source

Réponses:

31

Avec ffmpeg, je ne connais aucun moyen d'obtenir la longueur en tant que variable que vous pouvez utiliser sur un script. Mais mp3info le fait.

mp3info -p "%S" sample.mp3   // total time in seconds
Un nain
la source
oui, il n'y a aucun moyen d'obtenir des informations de longueur dans ffmpeg. Je l'ai déjà dit, j'utilise ffmpeg uniquement après avoir obtenu la longueur. Quoi qu'il en soit, merci pour la tête en haut.
ariefbayu
4
Il convient de noter que cela ne fournit que la longueur en tant que nombre entier. Il se peut donc que ce ne soit pas assez précis pour certains cas d'utilisation.
Ross
Meilleure réponse car cela fonctionne même avec le MP3 à débit moyen ou variable!
KrisWebDev
1
Ajouter \npour imprimer également une nouvelle ligne. > mp3info -p "%S\n" sample.mp3 // temps total en secondes
nexayq
22

ffmpegaffichera tout ce qu'il sait sur le fichier si vous ne lui donnez aucun autre argument. Utilisez greppour supprimer tout sauf la "Durée":

$ ffmpeg -i foo.mp3 2>&1 | grep Duration
  Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s

Vous pouvez également utiliser mplayer. Grep pour la ligne "ID_LENGTH =":

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
Quack Quichotte
la source
3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' 'Pour juste la portion de temps
Craig Tataryn
Pour résumer la longueur d'un ensemble de fichiers MP3, vous pouvez utiliser quelque chose comme TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTHpour imprimer la longueur totale de l'audio dans tous les fichiers, en secondes. Cela peut probablement être fait plus efficacement, mais comme je l'ai écrit de manière ponctuelle, c'était assez bon pour mes besoins. (La deuxième invocation awk supprime les décimales, donc le résultat n'est pas précis à 100%, mais encore une fois, assez bon pour mes besoins.)
un CVn
Méfiez-vous du drapeau de ffmpeg -analyzeduration. Fondamentalement, les chiffres qu'il rapporte sont des estimations après un certain point afin d'économiser du processeur.
mlissner
À l'aide d'un MP3 à débit moyen, ffmpeg signale une durée incorrecte avec cet avertissement Estimating duration from bitrate, this may be inaccurate. Je pense que cette réponse est valable uniquement avec Constant Bitrate MP3.
KrisWebDev
9

Fait intéressant, l' application EXIFTool donne la durée MP3 comme dernière ligne!

$ exiftool somefile.mp3
Numéro de version ExifTool: 7,98
Nom du fichier: somefile.mp3
Annuaire:.
Taille du fichier: 49 MB
Date / heure de modification du fichier: 2009: 09: 10 11: 04: 54 + 05: 30
Type de fichier: MP3
Type MIME: audio / mpeg
Version audio MPEG: 2.5
Couche audio: 3
Débit audio: 64000
Taux d'échantillonnage: 8000
Mode de canal: canal unique
MS stéréo: désactivé
Stéréo d'intensité: désactivé
Drapeau du droit d'auteur: Faux
Média d'origine: vrai
Souligné: aucun
Taille ID3: 26
Genre: Blues
Durée: 1:47:46 (environ)
nik
la source
3

Juste une autre façon d'obtenir la durée uniquement en utilisant ffmpeget grep:

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
FC
la source
2

Les solutions utilisant ffmpegme paraissent légèrement fragiles, car elles analysent une sortie qui n'est pas tout à fait conçue comme une interface. Cela dit, ils continueront probablement à travailler pendant plusieurs années malgré tout.

ffmpegest livré avec un outil ffprobepour obtenir des informations sur les fichiers audio (beaucoup de formats, y compris mp3), et peut produire une sortie lisible par machine. La commande suivante obtient la durée du morceau.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
Att Righ
la source
2
Vous pouvez simplement faireffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

Personnellement, j'utilise Mplayer pour extraire les informations, principalement parce que je les ai déjà installées et que cela ne me dérange pas d'installer de nouveaux logiciels inutilement. L'avantage de ceci est qu'il n'est pas limité aux fichiers mp3 en particulier, et devrait fonctionner avec n'importe quel fichier multimédia que Mplayer peut gérer. Le one-liner suivant renverra la longueur de la piste en secondes.

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
goldPseudo
la source
1

Vous pouvez utiliser ffmpeg pour obtenir la durée du fichier. Utilisez simplement:

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Monica Sol
la source
0

J'ai eu le même problème et j'ai trouvé que la commande mplayer (goldPseudo) fonctionnait bien, mais j'ai découvert par la suite que si vous ouvrez un album dans RhythmBox, vous verrez que sa ligne d'état donne le nombre de pistes, la durée totale de lecture et la taille du disque.

AFH
la source
-1

Voici ma simple utilisation en se référant ci-dessus.

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15

J'envoie cette valeur à la variable mp3_full_length

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`



# I can use this variable for my own purpose!
echo $mp3_full_length 
10:47:15

Merci au-dessus des gens! J'utilise vos idées et connaissances Merci d'avoir lu, bonne journée! ;)

Jeongpyo Lee
la source