vérifiez la durée des fichiers audio sur la ligne de commande

je dois vérifier la durée d'un groupe de fichiers audio. Est-il une façon simple de le faire sur la ligne de commande unix?

> duration *

j'ai l'étonnante application SoX qui a une option appelée stats qui génère un ensemble d'informations audio incluant la durée. Je cherche un moyen d'obtenir seulement la durée. Je suis flexible sur le format de sortie, peut être l'une des longueur de l'échantillon, hh:mm:ss ou les secondes. Ce dernier serait ma préférence.

29
demandé sur ted.strauss 2012-01-20 00:47:53

10 réponses

mp3info -p "%m:%s\n" filename

vous donne la longueur du fichier spécifié.

18
répondu 0xbadc0de 2012-01-19 21:08:00
soxi -D filename
soxi -D *

soxi recherche les métadonnées des fichiers audio; D est l'option de durée. Il prend en charge d'expansion. Le grand frère de Soxi!--2 -- > sox effectue le traitement audio en ligne de commande.

29
répondu ted.strauss 2012-01-21 16:41:54

mediainfo vous renvoie les millisecondes d'un fichier audio. En supposant que le répertoire courant n'ait que des fichiers audio, les

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"

pour calculer la durée de tout l'audio dans le répertoire local,ce gist pour vous aider:

shopt -s nullglob
let playlist_duration_ms=0
for song_file in *.{mp3,ogg,m4a,flac,wav}; do
  playlist_duration_ms=$(expr $playlist_duration_ms + $(mediainfo --Inform="Audio;%Duration%" "$song_file"))
done
shopt -u nullglob

let playlist_duration_secs=$(expr $playlist_duration_ms / 1000)
let playlist_duration_mins=$(expr $playlist_duration_ms / 60000)
let playlist_duration_remaining_secs=$(expr $playlist_duration_secs - $(expr $playlist_duration_mins \* 60))

echo $playlist_duration_mins minutes, $playlist_duration_remaining_secs seconds
9
répondu DoggoDougal 2015-10-28 16:34:55

sur OSX

afficher la longueur de chaque fichier audio dans le répertoire courant:

afinfo * | awk '/estimated duration/ { print  }'

Inclure le chemin d'accès du fichier:

afinfo * | awk '/File:/ { song= } /estimated duration/ { print song,  }'
7
répondu cdosborn 2016-02-27 00:39:41

en plus de cdosborn réponse, pour calculer la longueur de tous les .mp3 les fichiers de façon récursive dans les sous-dossiers du répertoire courant et afficher le résultat de la somme totale dans days:hours:minutes:seconds format:

Dans zsh:

afinfo **/*.mp3 | awk '/estimated duration/ { print  }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",(/60/60/24),(/60/60%24),(/60%60),(%60))}'

En bash ou sh:

find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print  }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",(/60/60/24),(/60/60%24),(/60%60),(%60))}'

Le résultat est comme ceci (7 jours, 5 heures, 6 minutes, 58 secondes):

$ afinfo **/*.mp3 | awk '/estimated duration/ { print  }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",(/60/60/24),(/60/60%24),(/60%60),(%60))}'
7:05:06:58
$
4
répondu Hamid Rohani 2017-05-28 08:56:06
ffmpeg -i <audiofile> 2>&1 | grep Duration
3
répondu JellicleCat 2018-02-06 02:48:14
sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 
3
répondu JJoao 2018-06-18 22:47:04

un Autre soxi réponse basée incluant les noms des fichiers et leur durée en heures, minutes et secondes.

$for f in *amr; do printf "$f "; soxi -d $f; done

DGT20161216.amr 00:22:04.62
DGT20170108.amr 00:28:22.80
DGT20170117.amr 00:20:05.18
2
répondu alemol 2017-05-02 19:17:25

mediainfo peut le faire, mais mediainfo est un de ces outils qui est si mal documenté que vous avez presque besoin de savoir comment l'utiliser afin d'apprendre comment l'utiliser (il se passe beaucoup de choses dans le monde de linux).

après des heures d'essais et de lecture haute et basse, j'ai finalement réussi à générer une liste recursive de noms de fichiers séparés par des virgules et leur durée en millisecondes.

cd à l'Annuaire de départ et d'émettre le suivant commande:

find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt

les résultats seront affichés dans la liste.txt.

1
répondu alex_223 2017-01-08 01:28:32

Une solution basée sur mplayer commandlinefu par syssyphus qui fonctionne avec des fichiers audio et vidéo:

sudo apt-get install mplayer
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1

Obtenir la longueur totale de tous les fichiers vidéo / audio dans le répertoire courant (et en dessous) dans H:m:s

Changer *.mp3 tout ce que vous voulez de match (par exemple, *.avi, *.wav), vous pouvez le supprimer complètement si vous souhaitez vérifier tous les fichiers.

Exemple de sortie: 00:00:37

1
répondu Franck Dernoncourt 2018-02-08 05:23:21