Forum: PC-Programmierung Wie MP3-Spieldauer berechnen


von Frank M. (Gast)


Lesenswert?

Hallo!

Für eine Art MP3-Player, den ich schreibe, brauche ich die Spieldauer 
eines MP3-Files.

Wie berechnet Windows die Spieldauer eines MP3-Files?
Oder wie kann man es auch machen?

Das muss gehen, ohne jedes einzelne Frame durchzurechnen, denn geht man 
mit der Maus über eine MP3-Datei erhält man sofort (ohne daß der Rechner 
auf der Platte rumorgelt) die Spieldauer.

Ich brauche die Spieldauer nur auf 2 Sekunden genau, Millisekunden sind 
egal.

Vielen Dank!

von X. H. (shadow0815)


Lesenswert?

Mit der Dateigröße und Bitrate die Spieldauer berechnen.
Bitrate kann man aus dem Header herausfinden.
Hier Infos (mal eben in Google gefunden, vielleicht gibs noch bessere)
zum Header-Aufbau:
http://sites.inka.de/sites/plagiats-home/mp3-header.html

von Stefan (Gast)


Lesenswert?

Wenn die Bitrate nicht konstant ist (VBR) wird das schwierig. Ich 
vermute mal das die Gesamtzeit eines Stückes vom den MP3 Encodern im 
Header abgelegt wird ?

Stefan

von Frank M. (Gast)


Lesenswert?

@X.H.
Wie Stefan geschrieben hat: bei VBR (variabler Bitrate) kann das dann ja 
nicht funktionieren.

@Stefan
Problem ist, daß nicht zwingend in jeder Datei die Gesamtspieldauer 
abgelegt sein muss...und auch leider nicht ist.

Aber wie berechnet z.B. Windows das so schnell und ohne die Datei 
zudurchforsten?

von Frank M. (Gast)


Lesenswert?

Oder gibts da vielleicht eine Trick, wenn man es nur auf 2 Sekunden 
genau braucht, also eine ziemlich genaue Schätzung?

von tastendrücker (Gast)


Lesenswert?

Da wirst du wohl rechnen müssen. Auch Player wie Winamp berechnen bei 
VBR wärend des Abspielens die durchschnittliche Bitrate und errechnen 
daraus die Spiellänge. Das ist gut an der Anzeige der Restspieldauer zu 
sehen, die bei VBR Tracks in den ersten 5-10 Sekunden doch stark 
schwankt. Nach ca. 20 Sekunden hat sich's dann eingependelt.

> Das muss gehen, ohne jedes einzelne Frame durchzurechnen, denn geht man
> mit der Maus über eine MP3-Datei erhält man sofort (ohne daß der Rechner
> auf der Platte rumorgelt) die Spieldauer.

Schon mal die von Windows errechnete Spieldauer nachgemessen ;-)? 
Windows gibt auch bei VBR eine Bitrate an, was ja eigentlich nicht sein 
kann.

von Rolf Magnus (Gast)


Lesenswert?

> Ich vermute mal das die Gesamtzeit eines Stückes vom den MP3 Encodern
> im Header abgelegt wird ?

Bei mp3 gibt's keinen Header. Es ist schließlich ein Streaming-Format.

> Windows gibt auch bei VBR eine Bitrate an, was ja eigentlich nicht sein
> kann.

Man kann aber eine durchschnittliche Bitrate errechnen.

von Sven (Gast)


Lesenswert?

@Rolf
Durchschnittliche Bitrate. Also die ersten 5 Frames nehmen und den 
Durchschnitt dann auf die gsamte File-Länge umrechnen?

von hereinspaziert (Gast)


Lesenswert?

Also ich hätte das jetzt ganz blöd einfach durch Dateigröße minus Header 
durch bitrate gerechnet...

von hereinspaziert (Gast)


Lesenswert?

Bei variabler Bitrate gibt diese ja eigentlich nur einen 
Durchschnittswert über dass gesamte Lied an, deshalb sollte es hier auch 
funtionieren.

Bsp:

3,2MB ~ 3.276,8KB
256kBit/s = 250KB/s

-> 3.276,8KB / 32KB/s  = 102,4s ~ 1m 42s

von hereinspaziert (Gast)


Lesenswert?

verdammt...

256kBit/s = 32KB/s

verfluchtes copy&paste...

von Sven (Gast)


Lesenswert?

Das versteh ich nicht. Bei MP3 wird pro Frame die Bitrate angegeben. Bei 
VBR wechselt diese eventuell von Frame zu Frame.

Und welcher Frame gibt mir dann die durchschnittliche Bitrate an? Gleich
der erste Frame?

von hereinspaziert (Gast)


Lesenswert?

So langsam dämmerts bei mir wieder...

Hier sind die Header und die nötigen Berechnungen nochmal erklärt:

http://gabriel.mp3-tech.org/mp3infotag.html
http://www.hydrogenaudio.org/forums/lofiversion/index.php/t5956.html
http://www.dv.co.yu/mpgscript/mpeghdr.htm

und hier hat jemand das gleiche vorgehabt, allerdings in Delphi. Hab mir 
den Quellcode nicht abgeschaut, aber das ist vielleicht ein Anfang.

http://timeforge.de/board/thread.php?threadid=89&sid=6463925831715c55d1d3e116f992abf8

Ansonsten würde ich dann wohl auch die ersten 5 - 10 Frames nehmen, 
wobei das aufgrund der Machart der meisten Lieder wohl eher ungeeignet 
ist. Daher zufällig 5 - 10 Frames aus dem ganzen Lied suchen dürfte der 
wirklichen Bitrate näher kommen.

von tastendrücker (Gast)


Lesenswert?

> Und welcher Frame gibt mir dann die durchschnittliche Bitrate an? Gleich
> der erste Frame?

Nein, die durchschnittliche Bitrate musst du errechnen (Bittraten von x 
Frames addieren und durch x teilen):

Frame 1: 192 kBit/s
Frame 2: 160 kBit/s
Frame 3: 160 kBit/s
-------------------
Summe:   512 kBit/s   /   3 Frames  =  170,67 kBit/s durchschnitt

Je mehr Frames du zur Berechnung verwendest, desto genauer wird's. Das 
beste Ergebnis erhälst du, wenn du alle Frames zur Berechnung 
heranziehst.

von Alibi (Gast)


Lesenswert?

> Bei mp3 gibt's keinen Header. Es ist schließlich ein Streaming-Format.

Seit wann wird bei Streaming sofort bei Datenempfang abgespielt? 
Natürlich gibts einen Header, schließlich muß ja sichergestellt sein, 
dass nicht jeder Blödsinn zum Decoder kommt.

von Henrik J. (henrikj)


Lesenswert?

Ob diese Verfahren so toll sind...

Deswegen habe ich nämlich MP3s, die mit 28:32 minuten gekennzeichnet 
sein. Sind aber trotzdem nach 4 Minuten zu Ende. :|

von tastendrücker (Gast)


Lesenswert?

> Natürlich gibts einen Header, schließlich muß ja sichergestellt sein,
> dass nicht jeder Blödsinn zum Decoder kommt.

Bei MP3 gibt es keinen File-Header. Jeder Frame hat seinen Frame-Header.

von Alibi (Gast)


Lesenswert?

Hab gar nicht mitbekommen, dass jemand von File-Header sprach.

von tastendrücker (Gast)


Lesenswert?

>> Ich vermute mal das die Gesamtzeit eines Stückes vom den MP3 Encodern
>> im Header abgelegt wird ?

>[...diverse Posts zum Thema Header...]

>Hab gar nicht mitbekommen, dass jemand von File-Header sprach.

Sorry, aber die erste Aussage/Frage lies mich vermuten, dass ein Gesamt- 
oder File-Header gemeint sei. Dass gemeint sein könnte, die Gesamtzeit 
steht in jedem Frame-Header, hatte ich nicht in Erwägung gezogen.

von Sven (Gast)


Lesenswert?

Na, es war vermutlich auch ein Header für den gesamten File gemeint. 
Denn ich suche nach einem schnellen Weg, ohne die ganze Datei 
durchzurechnen.

Also scheint nichts anderes zu geben, als ein paar Frames zu nehmen, 
einen Durchschnitt zu errechnen und dann auf die gesamte Filelänge 
umzurechnen.

von tastendrücker (Gast)


Lesenswert?

>Also scheint nichts anderes zu geben, als ein paar Frames zu nehmen,
>einen Durchschnitt zu errechnen und dann auf die gesamte Filelänge
>umzurechnen.

...und anschliessend im TAG speichern, damit nicht nochmal gerechnet 
werden muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.