Risposte:
Con ffmpeg non so come ottenere la lunghezza come variabile che puoi usare su uno script. Ma mp3info lo fa.
mp3info -p "%S" sample.mp3 // total time in seconds
\n
per stampare anche la nuova linea. > mp3info -p "%S\n" sample.mp3
// tempo totale in secondi
ffmpeg
stamperà tutto ciò che sa sul file se non gli fornisci altri argomenti. Utilizzare grep
per eliminare tutto tranne la "Durata":
$ ffmpeg -i foo.mp3 2>&1 | grep Duration
Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s
Puoi anche usare mplayer
. Grep per la riga "ID_LENGTH =":
$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTH
per stampare la lunghezza totale dell'audio in tutti i file, in secondi. Probabilmente può essere fatto in modo più efficiente, ma da quando l'ho scritto come una tantum, è stato abbastanza buono per le mie esigenze. (La seconda invocazione awk toglie i decimali, quindi il risultato non è accurato al 100%, ma di nuovo, abbastanza buono per le mie esigenze.)
Estimating duration from bitrate, this may be inaccurate
. Penso che questa risposta sia valida solo con Constant Bitrate MP3.
È interessante notare che l' applicazione EXIFTool dà la durata MP3 come ultima riga!
$ exiftool somefile.mp3 Numero versione ExifTool: 7.98 Nome file: somefile.mp3 Directory:. Dimensione file: 49 MB Data / ora modifica file: 2009: 09: 10 11: 04: 54 + 05: 30 Tipo di file: MP3 Tipo MIME: audio / mpeg Versione audio MPEG: 2.5 Livello audio: 3 Bitrate audio: 64000 Frequenza di campionamento: 8000 Modalità canale: canale singolo MS Stereo: spento Intensità stereo: Off Bandiera del copyright: Falso Supporti originali: vero Enfasi: nessuna Dimensione ID3: 26 Genere: Blues Durata: 1:47:46 (circa)
Le soluzioni che usano ffmpeg
mi sembrano leggermente fragili, dal momento che stanno analizzando l'output che non è del tutto progettato come interfaccia. Detto questo, probabilmente continueranno a lavorare per diversi anni a prescindere.
ffmpeg
viene fornito con uno strumento ffprobe
per ottenere informazioni sui file audio (molti formati, incluso mp3) e può produrre output leggibili dalla macchina. Il seguente comando ottiene la durata del brano.
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Personalmente uso Mplayer per estrarre le informazioni, soprattutto perché l'ho già installato e non posso preoccuparmi di installare inutilmente nuovo software. Il vantaggio è che non è limitato ai file mp3 in particolare e dovrebbe funzionare con qualsiasi file multimediale che Mplayer è in grado di gestire. Il seguente one-liner restituirà la lunghezza della traccia in secondi.
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
È possibile utilizzare ffmpeg per ottenere la durata del file. Usa solo:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Ecco il mio semplice utilizzo facendo riferimento sopra.
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15
Mando quel valore alla variabile mp3_full_length
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`
# I can use this variable for my own purpose!
echo $mp3_full_length
10:47:15
Grazie sopra le persone! Uso le tue idee e conoscenze Grazie per aver letto, buona giornata! ;)