Einzelnen Beitrag anzeigen

Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Länge (Zeit) eines MP3-Liedes?

  Alt 26. Sep 2004, 00:22
klasse...
wenn du aber mal nachgucken würdest würdest du sehen dass die unit die länge GENAU gleich berechnet.
---
MPEGaudio.pas -> function TMPEGaudio.FGetDuration: Double;
[..]
Result := (MPEGSize - FFrame.Position) / GetBitRate(FFrame) / 1000 * 8;
[..]
---

und mit dieser methode wirds auch net genau wenn du ein lied mit variabled bitrate hast.

das einzige was du in so einem fall machen kannst ist:
du liest alle frames und überprüfst von jedem einzelnen die bitrate und so kannst du von jedem einzelnen frame die länge berechnen und alle zusammenzählen. Dann wirds auch mit VBR genau und so wirds winamp wahrscheinlich auch machen.

bei CBR (konstante bitrate) reichts hingegen wenn du von einem frame die bitrate einliest (da alle frames die gleiche bitrate haben) und dann kannst du entweder:
-alle frames bloß zählen und mit der errechneten framelänge vom ausgangsframe multiplizieren oder
-einfach mal annehmen dass keine daten wie text oder so zwischen den frames ist und alles was vor dem ersten frame kommt (id3 v.2 oder so) wegschneiden und, falls vorhanden, den id3 v.1 tag (die letzten 128 byte)

die 2. möglichkeit geht halt schneller weil du nicht erst noch den letzten frame suchen musst.

und die funktion benützt wie gesagt auch die 2. möglichkeit:
(MPEGSize - FFrame.Position) / GetBitRate(FFrame) / 1000 * 8;

MPEGSize = Dateigröße
FFrame.Position = Position vom 1. frame(alles was davor ist ist KEIN audio (z.b. id3 v.2)
GetBitRate(FFrame) = Bitrate vom 1. frame
/ 1000 = kb->mb
* 8 = mBit -> mByte


achja apropos id3 v.1:
davor steht noch:
if FID3v1.Exists then MPEGSize := FFileLength - FID3v2.Size - 128;
sloo heisen:
wenn id3 tag existiert werden von der dateigröße noch mal 128 bytes weggeschnitten (id3 v.1 hat immer 128 byte)
Dominik Weber
www.edo-soft.com
  Mit Zitat antworten Zitat