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!
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
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
@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?
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.
> 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.
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
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?
> 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.
> 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.
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. :|
> 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.
>> 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.
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.
>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.