Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 06.09.03 15:26 
Ich arbeite grad an nem Programm, was mir verschiedene Informationen eines mp3-Albums liefert. Zum Beispiel auch die Spieldauer.
Bisher sieht das im wesentlichen so aus (fehlerbehandlungen entfernt etc.):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
PROCEDURE TForm1.SearchDirectory(Path: String);
var
  sr : TSearchrec;
begin
    if findfirst(Path+'\*',FaAnyfile,sr) = 0 then
    repeat
        if (sr.name<>'.') AND (sr.name<>'..') then
            dauer:=dauer+Spieldauer(Path+'\'+sr.name);
    until Findnext(sr)<>0;
    findclose(sr);
end;

function Tform1.Spieldauer(filename:string):integer;
var stream:PFSoundStream;
begin
    stream := FSOUND_Stream_OpenFile(pchar(filename),FSOUND_LOOP_NORMAL {or FSOUND_MPEGACCURATE} or FSOUND_NORMAL, 0);
    result:=FSOUND_Stream_GetLengthMs(stream);
end;

Am Ende lasse ich mir die Dauer so ausgeben
ausblenden Delphi-Quelltext
1:
2:
3:
min:=trunc(dauer/60000);
sek:=round((dauer/60000-min)*60);
memo1.lines.Add('Dauer: '+inttostr(min)+':'+inttostr(sek));

Problem: Da stimmt was nicht. Wenn ich "meine" Zeiten mit denen von Winamp vergleiche, habe ich abweichungen. Nicht nur bei einem Album mit mehreren Titeln (mögliche Fehlerquelle: Ich addiere die ms und runde am Ende, Winamp rundet evtl jeden Titel und berechnet daraus die Gesamtlänge...), sondern auch bei einzelnen (längeren) Titeln um mehrere Sekunden.
Wenn ich "FSOUND_MPEGACCURATE" nicht auskommentiere, erhalte ich diegleichen Werte wie Winamp. Und JA, die mp3s haben eine konstante Bitrate, keine variable. FSOUND_MPEGACCURATE sollte also nicht nötig sein. Und nebenbei, wenn ich ne ganze mp3CD damit bearbeite, dann is das etwas langwierig...
Kann mir da einer weiterhelfen? Gibt es z.b. ne andere Methode, an die Länge eines Stückes zu kommen?

_________________
We are, we were and will not be.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 11.09.03 08:16 
wie wäres wenn du die tags manuel ausliest, weil die länge wird ja wohl in der MP3 drinen stehen oder ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 11.09.03 10:36 
Ja, genau das mach ich mitlerweile auch. Dabei gabs aber jede Menge Probleme:
1.) Die Spieldauer steht nirgendwo im mp3-File (in der Regel)
2.) Ob überhaupt gewisse Informationen in den MP3-Files gespeichert sind, ist nicht gesichert. WENN sie gespeichert sind, ist immer noch die Frage, WO man sie auslesen kann. Das WO ist auch ein Frage bei Informationen, die drinstehen müssen (Bitrate, Samplerate etc.).
Und dann kann es in mp3-Files den ID3v1-Tag, den ID3v1.1-Tag, einen (oder mehrere) ID3v2-Tags, einen Xing-Header und/oder einen Lyrics3-Tag (in verschiedenen Versionen) geben. Und was LAME manchmal ans Ende anfügt, hab ich noch nicht rausfinden können. Und natürlich mehrere tausend MPEG-Header, einer für jeden Frame.
Eine frühe Version meiner Lösung findest du hier
www.delphi-forum.de/viewtopic.php?t=16088
Inzwischen wurde sie noch etwas erweitert.

_________________
We are, we were and will not be.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 11.09.03 11:27 
warum ist mp3 eingentlich so unübersichtlich ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 11.09.03 12:43 
Tja, das wüsste ich auch mal gerne.

Zum einen sollte das Format wohl streamingfähig oder so sein. d.h. ein player sollte in der Lage sein, an jeder beliebigen Stelle in das Stück einzusteigen, auch ohne den Anfang der Datei zu kennen. Daher muss jeder Audio-Frame einen Header haben, in dem Informationen über die Art der AudioDaten drin stehen. Daher muss der erste Header dieser Art auch nicht notwendig am Anfang der Datei stehen, wie es bei einfachen Formaten wie z.b. BMP der Fall ist.

Und dann das Gedöns mit den ZusatzInfos. Angefangen hat das wohl mit dem id3v1-Tag, der sehr einfach ist (die letzten 128 bytes eines mp3-files). Problem dabei ist, dass in 128 Bytes nur sehr wenig reinpasst, und daher hat man sich an Version2 rangemacht, und das würde dann EXTREM GRÜNDLICH gemacht. In den id3v2 Tag kann man theoretisch alles reinschreiben. Zum Beispiel Bilder. Oder das Video zu dem Lied. Oder vielleicht ein anderes mp3-File, indem der Ersteller seine Lebensgeschichte erzählt. Das würde dann eine rekursive Dateistruktur mit sich ziehen ;-) Oder sogar ein bissel ausführbaren Code, der einem die Platte formatiert, wer weiss..?
Leider ist die Größe eines id3v2 Tags auf 256 MB (=2^28 Byte) beschränkt, daher gibt es die Möglichkeit, im id3v2Tag anzugeben, ob (und wenn ja wo) ein WEITERER id3v2Tag in der Datei zu finden ist. Man ist eben auf alles vorbereitet...:eyecrazy:

Ein weiterer Punkt ist der, dass man die AudioFrames mit einem gültigen MPEG-Header missbrauchen kann, um weitere Informationen zu speichern. Warum das beim abspielen keine Probleme macht, weiss ich nicht genau. Liegt wohl an der Art der mp3-Komprimierung.
Das machen zum Beispiel XING und LAME, die in den ersten MPEGFrame bei mp3s mit vbr u.A. die Anzahl der Frames reinschreiben, um die Dauer des Stücks berechnen zu können, OHNE die ganze Datei untersuchen zu müssen.
Und da es eine Vielzahl von Encodern gibt, und theoreitsch jeder seinen Senf dazugeben kann, wird das ganze eben etwas kompliziert.

_________________
We are, we were and will not be.