![]() |
Spieldauer eines MP3s ermitteln?
Hallo, alle miteinander!
Weiss jemand, wie ich aus einer mp3-Datei die Spieldauer ermitteln kann? Inwieweit spielt die Bit-Rate dabei eine Rolle, und wie kann ich diese aus der Datei erfahren? Ich gehe mal davon aus, wenn ich die Bit-Rate kenne und die Dateigrösse habe, kann ich auch eine Spieldauer errechnen. Nur wie? Wäre klasse, wenn mir jemand weiterhelfen könnte! :?: Matthias |
Das hab ich in nem anderen Forum mal gefunden...
Delphi-Quellcode:
Damit kann man praktisch alles von ner mp3 auslesen
Type
TID3Tag = record ID: string[3]; Titel: string[30]; Artist: string[30]; Album: string[30]; Year: string[4]; Comment: string[30]; Genre: byte; dauer: longint; //in sekunden; sample: integer; bits: byte; vers: byte; layers: byte; end; const MPEG_BIT_RATES : array[1..3] of array[1..3] of array[0..15] of word = { Version 1, Layer I } (((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0), { Version 1, Layer II } (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0), { Version 1, Layer III } (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)), { Version 2, Layer I } ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), { Version 2, Layer II } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), { Version 2, Layer III } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)), { Version 2.5, Layer I } ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), { Version 2.5, Layer II } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), { Version 2.5, Layer III } (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0))); sample_rates: array[1..3] of array [0..3] of word= ((44100,48000,32000,0), (22050,24000,16000,0), (11025,12000,8000,0)); Es folgt die eigentliche „Auslese" Procedure: var ID3Tag: TID3Tag; procedure Lese_ID3Tag(Filename: string); var Buffer: array[1..128] of char; F: File; mp3hdrread: array[1..4] of byte; mp3hdr: longint absolute mp3hdrread; tempbyte, bitrateindex, versionindex: byte; bitrate, version, layer, groese: longint; begin AssignFile(F, Filename); Reset(F,1); groese:=filesize(f); blockread(f,mp3hdrread,4); tempbyte:=mp3hdrread[1]; mp3hdrread[1]:=mp3hdrread[4]; mp3hdrread[4]:=tempbyte; tempbyte:=mp3hdrread[2]; mp3hdrread[2]:=mp3hdrread[3]; mp3hdrread[3]:=tempbyte; reset(f,1); Seek(F,FileSize(F)-128); BlockRead(F, Buffer, SizeOf(Buffer)); CloseFile(F); bitrateindex:=((mp3hdr shr 12) and $F); versionindex:=((mp3hdr shr 19) and $3); case versionindex of 0: version:=3; 1: version:=0; //unbekannt 2: version:=2; 3: version:=1; end; layer:=4-((mp3hdr shr 17) and $3); if version<>0 then bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex] else bitrate:=128; with ID3Tag do begin ID:=copy(Buffer,1,3); Titel:=copy(Buffer,4,30); Artist:=copy(Buffer,34,30); Album:=copy(Buffer,64,30); Year:=copy(Buffer,94,4); Comment:=copy(Buffer,98,30); Genre:=ord(Buffer[128]); sample:=sample_rates[version][((mp3hdr shr 10) and $3)]; dauer:=(groese*8) div ((bitrate)*1000); bits:=bitrate; vers:=version; layers:=layer; end; end; Die Procedure kann man dann folgendermaßen Anwenden: procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Lese_ID3Tag(OpenDialog1.FileName); Titel.Caption:=ID3Tag.Titel; Artist.Caption:=ID3Tag.Artist; Album.Caption:=ID3Tag.Album; Year.Caption:=ID3Tag.Year; Comment.Caption:=ID3Tag.Comment; Genre.Caption:=IntToStr(ID3Tag.Genre); Duration.Caption:=IntToStr(id3tag.dauer); Samplerate.Caption:=IntToStr(id3tag.sample); Bitrate.Caption:=IntToStr(id3tag.bits); Layer.caption:=IntToStr(id3tag.layers); Yersion.caption:=IntToStr(id3tag.vers); end; end; |
Hallo!
Zitat:
Gruß, Sebastian |
Hallo,
ich habe den Thread nach Multimedia verschoben. Die Sparte Programmieren allgemein ist nur für andere Programmiersprachen. Wenn Du nicht weisst wo es hin soll, dann benutze das nächste mal Sonstiges. Grüsse, Daniel :hi: |
Hallo Grotesquery
Ich hab mich noch nicht mit diesem Theam befasst, ich hab, wie schon erwähnt, das obenstehende nur in einem anderen Forum mal gelesen und gespeichert. Hab also keine Ahnung, ob das funzt oder nicht. :hi: Stanlay |
Hallo!
Was mir auch noch eingefallen ist: Man sollte vorsichtig sein beim berechnen der Zeit über bitrate, du solltest auch Dateien mit variabler Bitrate (VBR) berücksichtigen. Ich hab den Quellcode nicht ganz durchgesehen, aber das wird häufig übersehen. Wenn dus dir einfach machen willst könntest du ja auch ne Komponente/Unit nehmen die dir die Arbeit mit den Tags und den Infos zu Spieldauer etc. abnimmt, bin sicher da lässt sich bei Torry was finden :wink: Gruß, Sebastian |
Genau das hab ich vor ner Stunde gemacht, weil mir eingefallen is, dass ich sowas in mein neues Programm integrieren könnte....bei Torry gibtd die Teile massenhaft
|
Tags (egal welche Version) sind für diesen Zweck so ziemlich das ungeeignetste, was es gibt. Es kann sein, daß der entsprechende Tag nicht benutzt wird, oder daß die Daten, die in ihm stehen, schlichtweg falsch sind. Einige MP3-Player schreiben beim Rippen nämlich weder den Playcounter-Frame, noch den Length-Frame, bringen also gar nichts.
Die tatsächliche Länge steht wie immer in den Dateiheadern, und zwar in denen des MPEG2.5-Streams. Den muss man auslesen. Praktische Bibltiotheken dafür wären BASS und FMOD, die zudem das ganze auch noch abspielen können (auch MP2, diverse Mod-Formate, OggVorbis und alle anderen PCM-Verfahren). Wer mit dem TMediaPlayer abspielt, läuft Gefahr, daß die Musik auf einem anderen Rechner nicht ertönt. Wenn man aus bitrate und Dateigröße die spiellänge berechnen will, muss man die beiden Tags (ID3v1 und ID3v2) und zusätzlich noch das Padding von ID3v2 beachten, ganz zu schweigen von den MPEG-Headern. Ist also alles andere als genau. Ich empfehle daher FMOD, da zusätzlich auch noch plattformunabhängig. Zu finden unter ![]() |
Zitat:
MfG Florian :hi: |
Zitat:
MfG Florian :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz