web-dev-qa-db-fra.com

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

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 . 

31
ted.strauss
mp3info -p "%m:%s\n" filename

vous donne la longueur du fichier spécifié.

22
0xbadc0de
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.

30
ted.strauss

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
12
DoggoDougal

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 }'
8
cdosborn
ffmpeg -i <audiofile> 2>&1 | grep Duration
6
JellicleCat

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
$
4
Hamid Rohani

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

3
Franck Dernoncourt
sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 
3
JJoao

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
2
alemol

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.

1
alex_223