J'ai besoin de vérifier la durée d'un groupe de fichiers audio . Yat-il un moyen simple de faire cela sur la ligne de commande unix?
> duration *
J'ai l'application étonnante SoX qui a une option appelée stats qui génère un ensemble d'informations audio, y compris la durée. Je suis à la recherche d’un moyen d’obtenir uniquement la durée ..__ Je suis flexible en ce qui concerne le format de sortie, quelle que soit la longueur de l’échantillon, hh: mm: ss ou secondes .
mp3info -p "%m:%s\n" filename
vous donne la longueur du fichier spécifié.
soxi -D filename
soxi -D *
Soxi interroge les métadonnées de fichiers audio; D est l'option de durée. Il supporte le globbing. Le grand frère de Soxi sox effectue le traitement audio en ligne de commande.
mediainfo
vous retournera les millisecondes d’un fichier audio. En supposant que le répertoire actuel ne contient que des fichiers audio, les éléments suivants
mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
Pour calculer la durée de toutes les données audio du répertoire local, this Gist aidera:
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
Imprimer la longueur de chaque fichier audio dans le répertoire en cours:
afinfo * | awk '/estimated duration/ { print $3 }'
Inclure le chemin du fichier:
afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
ffmpeg -i <audiofile> 2>&1 | grep Duration
En plus de answer de cdosborn, pour calculer la longueur de tous les fichiers .mp3
de manière récursive dans les sous-dossiers du répertoire actuel et afficher le résultat total au format days:hours:minutes:seconds
:
En zsh:
afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
En bash ou sh:
find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
Le résultat est comme ça (7 jours, 5 heures, 6 minutes, 58 secondes):
$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
7:05:06:58
$
Une solution basée sur mplayer de commandlinefu by syssyphus qui fonctionne avec les 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 +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1
Obtenir la longueur totale de tous les fichiers audio/vidéo dans le répertoire actuel (et au-dessous) dans H: m: s
Remplacez le
*.mp3
par tout ce que vous souhaitez comparer (par exemple,*.avi
,*.wav
), vous pouvez le supprimer complètement si vous souhaitez vérifier tous les fichiers.
Exemple de sortie: 00:00:37
sox --info -D file --> duration in seconds
sox --info -d file --> duration in HH:mm:ss.ss
sox --info file --> metadata
Une autre réponse basée sur soxi incluant les noms de fichier et leur durée en format 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
mediainfo peut le faire, mais mediainfo est l’un de ces outils utiles si mal documentés que vous avez presque besoin de savoir comment vous en servir pour apprendre à l’utiliser (cela arrive souvent dans le monde Linux).
Après des heures d’essais et des lectures hautes et basses, j’ai finalement pu générer une liste récursive de noms de fichiers séparés par des virgules et leur durée, en millisecondes.
allez dans le répertoire de départ et lancez la commande suivante:
find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt
Les résultats seront affichés dans list.txt.