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.
10 réponses
mp3info -p "%m:%s\n" filename
vous donne la longueur du fichier spécifié.
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.
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
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, }'
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
$
sox --info -D file --> duration in seconds
sox --info -d file --> duration in HH:mm:ss.ss
sox --info file --> metadata
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.
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