2012-01-19 4 views
23

Ho bisogno di controllare la durata di un gruppo di file audio. C'è un modo semplice per farlo sulla riga di comando di Unix?controlla la durata dei file audio sulla riga di comando

> duration * 

ho l'app sorprendenti Sox, che ha un'opzione chiamata statistiche che genera una serie di informazioni audio tra cui la durata. Sto cercando un modo per ottenere solo la durata. Sono flessibile nel formato di output, potrebbe essere una qualsiasi della lunghezza del campione, hh: mm: ss, o secondi. Quest'ultima sarebbe la mia preferenza.

risposta

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

fornisce la lunghezza del file specificato.

+1

così avvolgere che in un ciclo for e è tutto pronto, 'for file in * .mp3; fai mp3info -p "% m:% s \ n" $ file; done'. Buona fortuna a tutti. – shellter

+1

mp3info -p "% f% m:% s \ n" * .mp3 funziona pure - stamperà il nome del file e la durata –

25
soxi -D filename 
soxi -D * 

Soxi metadati di file audio; D è l'opzione di durata. Supporta il globbing. Il fratello maggiore di Soxi sox esegue l'elaborazione audio da riga di comando.

+0

soxi è quello che uso anch'io, ma sfortunatamente manca il supporto m4a – dan3

+0

Anche per ASF/WMV . – galva

7

mediainfo restituirà i millisecondi di un file audio. Supponendo che la directory corrente ha un solo file audio, il seguente

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

Per calcolare la durata di tutto l'audio nella directory locale, this gist aiuterà:

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

Questo strumento è ottimo, funziona anche per i file ogg ed è disponibile nei repository Debian – quantumbyte

+0

Penso che questa risposta richieda il minor numero di risorse dalla macchina che la esegue rispetto ad altre risposte. –

+0

Stampa solo una riga vuota per me. – JellicleCat

5

su OSX

Stampa la lunghezza di ogni file audio nella directory corrente:

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

Includere il percorso del file:

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

mediainfo può fare questo, ma Info è uno di quegli strumenti utili che è così male documentato che quasi bisogno di sapere come usarlo per imparare come usarlo (succede molto nel mondo linux).

Dopo ore di prove e di lettura in alto e in basso, ho finalmente ottenuto di generare un elenco di nomi file separati da virgola e la loro durata in millisecondi.

cd per la directory di partenza e emettere il seguente comando:

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

I risultati saranno output a list.txt.

4

Oltre a cdosborn di answer, per calcolare la lunghezza di tutti i .mp3 file ricorsivamente nelle sottocartelle di directory corrente e mostrare il risultato somma totale in days:hours:minutes:seconds formato:

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 o:

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

Il risultato è in questo (7 giorni, 5 ore, 6 minuti, 58 secondi OND):

$ 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

Un'altra soxi risposta in base compresi i nomi dei file e la durata in ore, minuti e formato secondi.

$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 
1
ffmpeg -i <audiofile> 2>&1 | grep Duration 
0

Una soluzione basata su MPlayer da commandlinefu da syssyphus che funziona sia con file audio e video:

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 

ottenere la lunghezza totale di tutti i video/audio la directory corrente (e sotto) in H: m: s

Modifica lo *.mp3 in base a ciò che desideri abbinare (ad esempio, *.avi, *.wav), puoi rimuoverlo completamente se desideri controllare tutti i file.

Esempio di emissione: 00:00:37