Holen Sie sich MP3 Length unter Linux / FreeBSD

27

Ich habe eine Reihe von MP3-Dateien mit unterschiedlicher Länge. Ich möchte es auf 50% -60% Länge kürzen. Sagt von 1 Minute bis 30 Sekunden. Es sollte mit ffmpeg trivial sein. Aber ich weiß nicht, wie ich die ursprüngliche Länge als Grundlage für die Verarbeitung mit ffmpeg bestimmen soll.

Hat jemand eine Idee?

ariefbayu
quelle

Antworten:

31

Mit ffmpeg gibt es keine Möglichkeit, die Länge als Variable zu ermitteln, die Sie für ein Skript verwenden können. Aber mp3info tut es.

mp3info -p "%S" sample.mp3   // total time in seconds
Ein Zwerg
quelle
Ja, es gibt keine Möglichkeit, Längeninformationen in ffmpeg abzurufen. Ich habe dort schon angegeben, ich benutze ffmpeg erst, nachdem ich die Länge bekommen habe. Wie auch immer, danke für die Heads-Ups.
Ariefbayu
4
Beachten Sie, dass dies nur die Länge als Ganzzahl angibt. Für einige Anwendungsfälle ist dies möglicherweise nicht genau genug.
Ross
Beste Antwort, da es sogar mit durchschnittlicher oder variabler Bitrate MP3 funktioniert!
KrisWebDev
1
Hinzufügen \n, um auch eine neue Zeile zu drucken. > mp3info -p "%S\n" sample.mp3 // Gesamtzeit in Sekunden
nexayq
22

ffmpegGibt alles aus, was er über die Datei weiß, wenn Sie ihm keine anderen Argumente geben. Verwenden Sie grepdiese Option, um alles außer der "Dauer" zu entfernen:

$ ffmpeg -i foo.mp3 2>&1 | grep Duration
  Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s

Sie könnten auch verwenden mplayer. Grep für Zeile "ID_LENGTH =":

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
Quacksalber
quelle
3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' Nur für den Zeitabschnitt
Craig Tataryn
Um die Länge einer Reihe von MP3-Dateien zu summieren, können Sie beispielsweise 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 $TOTLENGTHdie Gesamtlänge des Audios in allen Dateien in Sekunden drucken. Es kann wahrscheinlich effizienter gemacht werden, aber da ich es einmalig geschrieben habe, war es gut genug für meine Bedürfnisse. (Der zweite awk-Aufruf entfernt Dezimalstellen, sodass das Ergebnis nicht 100% genau ist, aber wieder gut genug für meine Bedürfnisse.)
CVn
Hüten Sie sich vor der Flagge von ffmpeg. Grundsätzlich handelt es sich bei den angegebenen Zahlen um Schätzungen nach einem bestimmten Zeitpunkt, um CPU zu sparen.
mlissner
Bei Verwendung einer durchschnittlichen Bitrate MP3 meldet ffmpeg zusammen mit dieser Warnung eine falsche Dauer Estimating duration from bitrate, this may be inaccurate. Ich denke, diese Antwort ist nur mit konstanter Bitrate MP3 gültig .
KrisWebDev
9

Interessanterweise gibt die EXIFTool- Anwendung die MP3-Dauer als letzte Zeile an!

$ exiftool somefile.mp3
ExifTool-Versionsnummer: 7.98
Dateiname: somefile.mp3
Verzeichnis : .
Dateigröße: 49 MB
Änderungsdatum / -zeit der Datei: 2009: 09: 10 11: 04: 54 + 05: 30
Dateityp: MP3
MIME-Typ: Audio / MPEG
MPEG Audio Version: 2.5
Audioebene: 3
Audio-Bitrate: 64000
Abtastrate: 8000
Kanalmodus: Einzelkanal
MS Stereo: Aus
Intensität Stereo: Aus
Copyright-Kennzeichnung: Falsch
Originalmedien: Richtig
Betonung: Keine
ID3 Größe: 26
Genre: Blues
Dauer: 1:47:46 (ungefähr)
nik
quelle
3

Nur eine andere Möglichkeit, die Dauer nur mit ffmpegund zu ermitteln 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
FC
quelle
2

Die Lösungen, die verwendet werden ffmpeg, sind für mich etwas fragil, da sie Ausgaben analysieren, die nicht als Schnittstelle konzipiert sind. Trotzdem werden sie wahrscheinlich noch einige Jahre weiterarbeiten.

ffmpegkommt mit einem Tool ffprobezum Abrufen von Informationen zu Audiodateien (viele Formate, einschließlich MP3) und kann maschinenlesbare Ausgaben produzieren. Der folgende Befehl ruft die Song-Dauer ab.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
Att Righ
quelle
2
Sie können einfach tunffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

Ich persönlich verwende Mplayer , um die Informationen zu extrahieren, hauptsächlich, weil ich sie bereits installiert habe und nicht die Mühe habe, unnötig neue Software zu installieren. Der Vorteil dabei ist, dass es nicht auf MP3-Dateien beschränkt ist und mit jeder Mediendatei funktionieren sollte, die Mplayer verarbeiten kann. Der folgende Einzeiler gibt die Länge der Spur in Sekunden zurück.

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
goldPseudo
quelle
1

Sie können ffmpeg verwenden, um die Dauer der Datei abzurufen. Benutz einfach:

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

Ich hatte das gleiche Problem und fand, dass der mplayer-Befehl (goldPseudo) gut funktionierte, aber ich stellte später fest, dass beim Öffnen eines Albums in RhythmBox in der Statuszeile die Anzahl der Titel, die Gesamtspielzeit und die Disc-Größe angezeigt werden.

AFH
quelle
-1

Hier ist meine einfache Verwendung unter Bezugnahme auf oben.

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

Ich sende diesen Wert an die Variable 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

Vielen Dank über Menschen! Ich verwende Ihre Ideen und Kenntnisse. Vielen Dank für das Lesen. Ich wünsche Ihnen einen schönen Tag! ;)

Jeongpyo Lee
quelle