2012-01-19 12 views
23

Potrzebuję sprawdzić czas trwania grupy plików audio. Czy istnieje prosty sposób na wykonanie tej czynności w wierszu poleceń systemu Unix?Sprawdź czas trwania plików audio w wierszu polecenia

Mam niesamowitą aplikację SoX, która ma opcję o nazwie statystyki, która generuje zestaw informacji audio, w tym czas trwania. Szukam sposobu na uzyskanie tylko czasu trwania. Jestem elastyczny w formacie wyjściowym, może to być dowolna długość próbki, hh: mm: ss lub sekundy. Ten drugi byłby moją preferencją.

Odpowiedz

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

podaje długość określonego pliku.

+1

więc owinąć że w pętli for i gotowe, 'do pliku w formacie * .mp3; do pliku mp3info -p "% m:% s \ n" $; done'. Powodzenia wszystkim. – shellter

+1

mp3info -p "% f% m:% s \ n" * .mp3 działa również - wyświetli nazwę pliku i czas trwania –

25
soxi -D filename 
soxi -D * 

Soxi zapytuje o metadane plików audio; D to opcja duration. Obsługuje globbing. Wielki brat Soxiego sox wykonuje przetwarzanie dźwięku w linii poleceń.

+0

Soxi jest tym, czego używam też, ale niestety brakuje mu obsługi m4a – dan3

+0

Dla ASF/WMV też . – galva

7

mediainfo powróci do Ciebie w milisekundach pliku audio. Zakładając, bieżący katalog zawiera tylko pliki audio, następujące

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

Aby obliczyć czas trwania wszystkich dźwiękiem w katalogu lokalnym, this gist pomoże:

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 
+0

To narzędzie jest świetne, działa również na pliki ogg i jest dostępne w repozytoriach debian – quantumbyte

+0

Myślę, że ta odpowiedź wymaga najmniej zasobów z komputera, na którym działa, w porównaniu do innych odpowiedzi. –

+0

Tylko drukuje pustą linię dla mnie. – JellicleCat

5

na OSX

Drukuj długość każdego pliku audio w bieżącym katalogu:

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

Dołącz filepath:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }' 
1

MediaInfo można to zrobić, ale MediaInfo jest jednym z tych przydatnych narzędzi, które jest tak źle udokumentowane, że prawie trzeba wiedzieć jak go używać, aby dowiedzieć się, jak go używać (dużo się dzieje w świecie linuxowym).

Po godzinach prób i odczytaniu wysokiego i niskiego poziomu, w końcu udało mi się wygenerować rekurencyjną listę nazw plików rozdzieloną przecinkami i ich czas trwania w milisekundach.

cd do katalogu wyjściowego i wydać następujące polecenie:

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

wyniki będą wyprowadzane do lista.txt.

4

Oprócz cdosborn na answer, aby obliczyć długość wszystkich .mp3 plikach rekurencyjnie w podfolderach katalogu bieżącym i pokazują całkowity wynik sumy w formacie days:hours:minutes:seconds:

W 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))}' 

W bash lub 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))}' 

Rezultat jest podobny (7 dni, 5 godzin, 6 minut, 58 sekund onds):

$ 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 
$ 
1

Innym soxi odpowiedź opiera się w tym nazw plików i czas w godzinach, minutach i sekundach formacie.

$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 
0
sox --info -D file    --> duration in seconds 
sox --info -d file    --> duration in HH:mm:ss.ss 
sox --info fils    --> metadata 
0

rozwiązanie oparte na MPlayera z commandlinefu przez syssyphus że działa zarówno plików audio i wideo:

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 

uzyskać całkowitą długość wszystkich audio/video w bieżący katalog (i poniżej) w H: m: s

Zmień *.mp3 na dowolny, który chcesz dopasować (np. *.avi, *.wav), możesz go całkowicie usunąć, jeśli chcesz sprawdzić wszystkie pliki.

Przykład wyjścia: 00:00:37