Autor Beitrag
Luncustaf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: Di 15.04.03 09:02 
Hi,

wie kann ich die Spielänge einer Mp3 datei in minuten rausbekommen?

so das ich da stehen habe -> Track1 - 6.52 MB - 3:15 Min <-


gr€€tz
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Di 15.04.03 09:27 
ich hab im EDH einen Code gefunden, der dir die ID3 Tags ausliest. der gibt dir auch die Spieldauer zurück:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
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));





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;


Ist nicht die beste methode, geht aber.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Di 15.04.03 16:42 
Stimmt, das Verfahren ist wirklich nicht das Beste. In den Tag kann man schließlich schreiben was man will und evtl ist nichtmal ein ID3v2-Tag vorhanden.
Die Länge gibt dir zum Beispiel die FMOD-Library. Ich weiß ja nicht, wie du die MP3s abspielst, "normale" Player-Engines können sowas i.d.R.
Oder du schnappst dir bei CBR-MP3s die Bitrate und die Länge der Audiodaten (Filesize - v2-Tag - v1-Tag - MPEG-Header) und teilst es durch die Bitrate. Ist es eine VBR-MP3, dann musst du das für jeden Audioframe tun, der eine andere Bitrate hat.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Luncustaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: Mi 16.04.03 09:17 
hi tommie-lie

sorry aber geht das auch in deutsch :) ich hab von dem was du geschrieben hast null verstanden :( bin auf solchen gebieten nicht so bewandert


gr€€tz
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mi 16.04.03 10:00 
Er hat ein Verfahren beschrieben, wie du die Spiellänge der MP3 anhand der Größe und der Bitrate, sprich der "Kompressionsrate" wenn du so willst, ermitteln kannst. (@tommie-lie ich denke du kannst das nochmal schöner ausführen :mrgreen:)
Doch um ehrlich zu sein, ich würde dir eine Sound-API wie [url=www.fmod.de]fmod[/url] oder BASS empfehlen (kenn grad den Link nicht). Ich habe schonmal mit der fmod-Library gearbeitet und war sehr zufrieden damit. Guck dir einfach mal die Seite an. Fmod ist eine kleine DLL mit ein paar Units zum ansteuern die dir das Abspielen und den Zugriff auf sehr viele Audioformate ermöglicht.
Natürlich kannst du auch einfach die Spiellänge mittels TMediaPlayer ermitteln, doch ist das doritge Verfahren a**** langsam. Wenn du da 50 mp3s hintereinander einliest, kratz das Teil ab. Da ist fmod sehr viel schneller.
Viel gelabert, eine Message: Nimm fmod :wink:

P.S.: @tommie-lee Wie du schon sagtest, in die ID3-Tags kann man schreiben, was man will, so könnte man doch auch einfach die Bitrate ändern? Oder kann man diese im nachhienein erechnen... :?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mi 16.04.03 11:42 
Luncustaf hat folgendes geschrieben:
sorry aber geht das auch in deutsch :-) ich hab von dem was du geschrieben hast null verstanden :-( bin auf solchen gebieten nicht so bewandert

Sorry. Hatte gesehen, daß du hier in kurzer Zeit schon mehrere Fragen bezüglich ID3 gestellt hast und dachte, du hättest dich vorher mit MP3 an sich beschäftigt, deswegen hatte ich ein wenig Grundwissen vorrausgesetzt.

O'rallY hat folgendes geschrieben:
@tommie-lie ich denke du kannst das nochmal schöner ausführen

Jupp. Daher hier:

MP3 bedeutet MPEG Layer 3, ist also die dritte Entwicklungsschicht von MPEG (aktuell MPEG2.5, für MPEG3 gibt es meines Wissens keinen Layer 3 mehr). Alle MPEG-Streams sind Frameweise aufgebaut, ähnlich den RIFF-Chunks von Waveform-Dateien (nachzulesen hier in den Tutorials). Bei MP3 wird zwischen CBR (Constant Bitrate) und VBR (Variable Bitrate). Bei CBR sind die gesamten Audiodaten mit ein und derselben Bitrate codiert, normalerweise in einem MPeg-Frame (nicht zu verwechseln mit den Audioframes, wie sie auch auf CDs existieren, die 1/75 Sekunde entsprechen), wodurch die Spiellänge genau bestimmt werden kann (Größe / Bitrate = Zeit). Ein weiterer Vorteil ist die schnellere Encodierung und die größere Bestimmbarkeit der resultierenden Größte. Bei VBR hingegen, gibt es einen Prozentsatz. Was dieser genau zu besagen hat, weiß ich nicht, bei MusicMatch fällt er aus allen Relationen und einen eigenen Codec habe ich noch nicht geschrieben. Hierbei wird die Bitrate über die Spiellänge verteilt. Teile des Songs, die schwierig zu kodieren sind, bekommen eine größere Bitrate, um die Qualität zu steigern, Mutes oder ähnlich leichte Hürden für den encodern bekommen eine niedrigere Bitrate. Dadurch wird die Audioqualität beträchtlich verbessert, allerdings zu Lasten der Geschwindigkeit (immerhin muss der ganze Song vorher analysiert werden) und auch zu Lasten der Vorhersagbarkeit. Da man vorher nicht weiß, wo der Encoder welche Bitrate berechnet, weiß man natürlich vorher nicht, wie groß die MP3-Datei werden wird. Modernere Codecs wie MP3Pro oder Ogg haben dazu einen erweiterten VBR-Modus eingeführt, bei dem man eine Average Bitrate eingeben kann und einen Rahmen, in dem sich die jeweils berechente Bitrate bewegen darf. Damit wird die Vorhersagbarkeit der Größe erhöht, denn man weiß, daß es so ungefähr 128bit/s sein werden (oft stimmt das im Durchschnitt auch).
Soweit klar?
Da VBR auf ganzer Songlänge mehrere Bitraten hat, muss das Stück in mehrere MPeg-Frames unterteilt werden, jeder mit einer eigenen Bitrate.

Willst du jetzt also CBR-Spiellängen bestimmen, must du dir aus dem Frame-Header des MPEg-Streams (es gibt ja nur einen Frame) die Bitrate holen (wie das genau geht weiß ich auch nicht, nachzulesen evtl bei mpeg.org) nd durch die Länge der Audiodaten teilen.
Bei einer VBR-MP3 ist das schwieriger, weil du da ja für jeden Frame eine andere Bitrate hast. Da musst du also jeden Frame durchgehen und die Länge jedes Frames bestimmen und dann alle addieren, um die Gesamtlänge zu erhalten.
Das Prinzip der Frames macht sich ID3 zu Nutze. ID3v1 sind 128 Byte am Ende der Datei, wo es eigentlich keinen Decoder stören sollte (ist ja außerhalb aller MPeg-Frames). ID3v2 hat dann das sogenannte Unsynchronisation Scheme eingeführt, womit der Tag an den Anfang der Datei gerutscht ist (seit ID3v2.4 auch innerhalb der Datei, nur außerhalb eines gültigen MPeg-Frames, aber das geht zuweit), was Streamingmöglichkeiten über's Internet erhöhen soll (der Tag kommt als erstes durch die Leitung). Du musst also bei CBR-Dateien, um die Länge der komprimeirten Audiodaten zu erhalten, die gesamte Datei nehmen, den ID3v1-Tag abziehen, den ID3v2-Tag abziehen und die MPeg-Frameheader abziehen (ID3-Tags sofern vorhanden, das muss also vorher geprüft werden). Übrig bleiben die reinen Audiodaten. Bei VBR ist es dann noch komplizierter.

So, das war die kleine Einführung zum Thema MP3 und why it's so difficult to determine the length...

Ich kann FMOD wirklich nur empfehlen. BASS ist zwar etwas einfacher gestrickt, aber (nach eigenen Messungen) CPU-Intensiver. Allerdings kann FMOD auch keine Wunder bewirken und hat bei VBR auch seine Probleme. Dort muss man über ein entsprechendes Flag beim Öffnen der Datei angeben, daß die gesamte Datei gescannt werden soll, bevor sie fertig zum Bearbeiten ist. Dadurch können sich je nach Festplatten- und CPU-Performance die Zeiten zum Öffnen eienr Datei auf mehrere Sekunden erhöhen, anders ist es aber nicht möglich, zuverlässig die Länge einer VBR-Datei zu bestimmen.


O'rallY hat folgendes geschrieben:
Wie du schon sagtest, in die ID3-Tags kann man schreiben, was man will, so könnte man doch auch einfach die Bitrate ändern? Oder kann man diese im nachhienein erechnen...

Steht die Bitrate im ID3-Tag? ID3v2 hat zwar glaub' ich ein Frame dafür, aber kein Decoder sollte sich daran halten. Die Bitrate eines jeden MPeg-Frames steht in den Mpeg-Headern, die zu Beginn des Frames zu finden sind. Alles andere wäre viel zu unsicher, denn schon ein falsches Flag für Mono/Stereo erzeugt nur kratzen und rauschen (kann man schön nachvollziehen, wenn man es entsprechend meines MMAPI-Tutorials mit Wave-Dateien ausprobiert *g*).


So, alle Klarheiten beseitigt?

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Luncustaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: Mi 16.04.03 12:07 
hiho,

vielen vielen dank an euch bei :)

thx für die ausführliche beschreibung @ tommie-lie - habs kurz überflogen (bin auf arbeit) werde es mir zuhause nochmal ausführlicher reinziehen.

thx an O'rally für den fmod link werde ich mir auch mal zu gemüte führen :D

dieses forum roxxx0rt derbe :)

thx a lot

gr€€tz