Ich muss die Dauer einer Gruppe von Audiodateien überprüfen. Gibt es eine einfache Möglichkeit, dies in der Unix-Befehlszeile zu tun?
> duration *
Ich habe die erstaunliche SoX-App, die eine Option namens stats hat, die eine Reihe von Audio-Informationen einschließlich Dauer generiert. Ich bin auf der Suche nach einer Möglichkeit, nur Dauer zu erhalten. Ich bin flexibel beim Ausgabeformat, es könnte eine beliebige Musterlänge sein, hh: mm: ss oder Sekunden. Letzteres wäre meine Präferenz .
mp3info -p "%m:%s\n" filename
gibt die Länge der angegebenen Datei an.
soxi -D filename
soxi -D *
Soxi fragt Metadaten von Audiodateien ab; D ist die Daueroption. Es unterstützt Globbing. Soxis großer Bruder sox führt die Befehlszeilen-Audiobearbeitung aus.
mediainfo
gibt Ihnen die Millisekunden einer Audiodatei zurück. Angenommen, das aktuelle Verzeichnis enthält nur Audiodateien
mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
Um die Dauer aller Audiodaten im lokalen Verzeichnis zu berechnen, hilft diese Gist :
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
unter OSX
Drucken Sie die Länge jeder Audiodatei im aktuellen Verzeichnis:
afinfo * | awk '/estimated duration/ { print $3 }'
Fügen Sie den Dateipfad hinzu:
afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
ffmpeg -i <audiofile> 2>&1 | grep Duration
Um zusätzlich zu cdosborn answer die Länge aller .mp3
-Dateien rekursiv in Unterordnern des aktuellen Verzeichnisses zu berechnen und das Gesamtergebnis der Summe im days:hours:minutes:seconds
-Format anzuzeigen:
In 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))}'
In Bash oder 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))}'
Das Ergebnis sieht so aus (7 Tage, 5 Stunden, 6 Minuten, 58 Sekunden):
$ 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
$
Eine auf mplayer basierende Lösung von commandlinefu by syssyphus , die sowohl mit Audio- als auch Videodateien funktioniert:
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
Liefert die Gesamtlänge aller Video-/Audiodateien im aktuellen Verzeichnis (und darunter) in H: m: s
Ändern Sie den
*.mp3
in das, was Sie abgleichen möchten (z. B.*.avi
,*.wav
). Sie können es vollständig entfernen, wenn Sie alle Dateien überprüfen möchten.
Beispiel für die Ausgabe: 00:00:37
sox --info -D file --> duration in seconds
sox --info -d file --> duration in HH:mm:ss.ss
sox --info file --> metadata
Eine andere soxi basierte Antwort, einschließlich Dateinamen und Dauer in Stunden, Minuten und Sekunden.
$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 kann dies, aber mediainfo ist eines dieser nützlichen Tools, das so schlecht dokumentiert ist, dass man fast wissen muss, wie man es benutzt, um zu lernen, wie man es benutzt (was in der Linux-Welt viel passiert).
Nach stundenlangen Versuchen und dem Lesen von Hoch und Tief habe ich es endlich geschafft, eine rekursive, durch Kommas getrennte Liste von Dateinamen und deren Dauer in Millisekunden zu generieren.
cd in das Ausgangsverzeichnis und geben Sie den folgenden Befehl aus:
find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt
Die Ergebnisse werden in list.txt ausgegeben.
ffprobe
ffprobe your_file.mp3 2>&1 | grep "Duration"
Die Ausgabe sieht folgendermaßen aus:
Dauer: 00: 44: 33,50, Start: 0,011995, Bitrate: 128 kb /
(Wenn Sie nicht über afinfo
verfügen) Ich habe es rekursiv für alle meine Dateien erhalten
# install mp3info if not yet installed with
Sudo apt-get install mp3info
geben Sie mit dem Befehl find die Gesamtsekunde in eine CSV-Datei ein (wechseln Sie zuerst in das Verzeichnis mit Ihren beispielsweise MP3-Dateien).
find . -name "*.mp3" -exec mp3info {} -p "%S\r\n" >> totalSeconds.csv \;
Öffnen Sie es dann in z. in LibreOffice und fasse es unten zusammen (um die Stunden zu erhalten) mit
=SUM(A{start}:A{end})/60/60