Ottieni lunghezza MP3 in Linux / FreeBSD


27

Ho un sacco di file mp3 con varie lunghezze. Voglio ridurlo al 50% -60% di lunghezza. Dice, da 1 minuto a 30 secondi. Dovrebbe essere banale usando ffmpeg. Ma non so come determinarne la lunghezza originale come base per l'elaborazione usando ffmpeg.

Qualcuno ha un'idea?

Risposte:


31

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

sì, non c'è modo di ottenere informazioni sulla lunghezza in ffmpeg. Ho già dichiarato lì, uso ffmpeg solo dopo aver ottenuto la lunghezza. Comunque, grazie per il testa a testa.
ariefbayu,

4
Vale la pena notare che questo fornisce solo la lunghezza come numero intero. Quindi potrebbe non essere abbastanza preciso per alcuni casi d'uso.
Ross,

La migliore risposta in quanto funziona anche con MP3 con bitrate medio o variabile!
KrisWebDev,

1
Aggiungi \nper stampare anche la nuova linea. > mp3info -p "%S\n" sample.mp3 // tempo totale in secondi
nexayq

22

ffmpegstamperà tutto ciò che sa sul file se non gli fornisci altri argomenti. Utilizzare grepper 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

3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {stampa substr ($ 2,0, lunghezza ($ 2) -1)}' Solo per la parte del tempo
Craig Tataryn,

Per sommare la lunghezza di un set di file MP3, puoi usare qualcosa di simile 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 $TOTLENGTHper 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.)
un CVn

Fai attenzione alla bandiera analyzeduration di ffmpeg. Fondamentalmente, i numeri che riporta sono stime dopo un certo punto per salvare la CPU.
mlissner,

Utilizzando un MP3 Bitrate medio, ffmpeg riporta una durata errata insieme a questo avviso Estimating duration from bitrate, this may be inaccurate. Penso che questa risposta sia valida solo con Constant Bitrate MP3.
KrisWebDev,

9

È 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)

3

Solo un altro modo per ottenere la durata solo usando ffmpege grep:

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12

2

Le soluzioni che usano ffmpegmi 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.

ffmpegviene fornito con uno strumento ffprobeper 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'

2
Puoi semplicemente farloffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan l'

1

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

1

È possibile utilizzare ffmpeg per ottenere la durata del file. Usa solo:

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//

0

Ho avuto lo stesso problema e ho scoperto che il comando mplayer (goldPseudo) funzionava bene, ma successivamente ho scoperto che se aprite un album in RhythmBox vedrete la sua linea di stato che fornisce il numero di tracce, il tempo di riproduzione totale e le dimensioni del disco.


-1

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! ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.