Autor Beitrag
Alex_ITA01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Di 30.09.03 11:19 
Hallo an alle,ich würde gerne mal gebrauch vom Id3Tag machen.
Ich hab ihn auch schon angewannt und er geht ja auch aber es gibt ein problem,
er zeigt mir die dauer der mp3 falsch an. wie kann ich sie noch auslesen?
danke alex
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: Di 30.09.03 11:25 
Oh, mein Spezialgebiet ;-)
Welche Version vom ID3Tag willst du denn gebrauchen? In v1 oder v1.1 steht nämlich nix von der Dauer drin. In ID3v2 kann die Dauer drin stehen, aber das kann auch ein Phantasiewert sein, der mit der eigentlichen Länge nichts zu tun hat. Besser ist es, die Länge des MP3s zu berechnen. Wie das geht, steht in den FAQs:
www.delphi-forum.de/viewtopic.php?t=16228

_________________
We are, we were and will not be.
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Di 30.09.03 11:30 
Titel: Danke
danke schön ich werde gleich mal nachgucken
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Di 30.09.03 11:34 
Titel: habs
so habs mir mal angeguckt aber was in diesem sehr kurzen Code (ironie)
ist für die länge nun ausschlaggiebig? Wie ließt der mediaplayer oder winamp dann die länge aus?
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: Di 30.09.03 11:39 
gut, aber dann änder die Funktion ggf. etwas ab. Die Berechnung von Framelength und Xing_header_size kann nämlich mal daneben gehen.
besser funktioniert da
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if mpeginfo.layer=1 then
  framelength:=12*MPEG_BIT_RATES[mpeginfo.version][mpeginfo.layer][bitrateindex]*1000 DIV mpeginfo.samplerate+padding*4
  else
  framelength:=144*MPEG_BIT_RATES[mpeginfo.version][mpeginfo.layer][bitrateindex]*1000 DIV mpeginfo.samplerate+padding;

Bei xing_header_size ebenso.
Meistens funktioniert das andere auch, aber diese hier funktioniert öfter. Aber das hab ich erst gemerkt, NACHDEM ich den Beitrag abgesandt habe...

_________________
We are, we were and will not be.
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: Di 30.09.03 11:54 
Hmm.. was da genau ausschlaggebend ist: Fast alles.
Denn eine mp3-datei ist variabel aufgebaut, und für die korrekte Berechnung sollte man auf fast alles vorbereitet sein.

Der Kern einer mp3 besteht aus mehreren hundert (je nach Länge) MPEG -Frames. diese beinhalten die Audiodaten. Jeder Frame beginnt mit einem Header, in dem die nötigen Informationen drin stehen, die zum Abspielen benötigt werden. Diese werden auch für die Längenberechnung benötigt.
Den Teil MPEG-HEADER auslesen ist also Pflicht. Ein MPEG HEADER beginnt mit 11 gesetzten Bits.

Jetzt KANN am Anfang einer mp3-Datei der ID3v2Tag stehen. Der kann bis zu 256MB groß sein. Diesen sollte man auch (teilweise) auslesen, um schneller zum ersten MPEG-Frame zu gelangen.

Mit VBR wirds ganz kompliziert. Normalerweise reicht es, aus der Bitrate und der Dateigröße die Anzahl der Frames zu berechnen, um die Spieldauer zu bekommen. Jeder Frame hat bei CBR die gleiche Größe.
Bei VBR kann jeder Frame eine andere Bitrate haben, also geht diese Berechnung schief. Daher haben sich die XING-Entwickler geacht: "Entwickeln wir doch einen XING-HEADER". Dieser versteckt sich im ersten MPEG-Frame. JA, ein gültiger MPEG-Frame, der keine Audiodaten enthält, sondern Informationen über das MP3-File. So zum Beispiel die Anzahl der Frames, die man zur Berechnung der Spieldauer braucht. Also muss man auch diesen auswerten.
D.h. wenn man nur den ersten MPEG-Frame sucht, kann es passieren, dass man den Xing-header trifft und Murks berechnet.

Und am Ende KANN der id3v1 (v1.1) Tag stehen. Diesen kann man vernachlässigen. 128 Bytes machen keinen Ärger.

Wie Winamp das macht? Ich vermute mal ungefähr genauso wie ich, denn ich bekomme immer diegleichen Ergebnisse wie Winamp ;-) Auch bei "vermurksten" mp3s, wo noch anderer Müll drin steht.
Und btw: es sieht lang aus, aber es geht schnell. Eine einzelne Info ist in Nullkommanix da, und eine MP3-CD ist schneller ausgwertet als Winamp die Playlist vollständig hat.

Nur noch zur Kalrheit: Man kann die Länge nicht "auslesen", weil sie nirgendwo verlässlich drinsteht! Schliesslich ist mp3 ja kein eigentlcihes Dateiformat. Es ist ja Streaming-fähig, d.h. man kann die ersten 2 MB verpassen, und dann in das Stück einsteigen, auch wenn man das Ende noch nicht kennt. Wozu also die Länge speichern?

_________________
We are, we were and will not be.
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Di 30.09.03 11:59 
Titel: Danke für die Tips
Danke gausi
nur du hast es echt gut beschrieben aber könntest du mir nicht mal ein Source dafür schicken? Ich weiß nicht wie ich es realisieren sol. bitte
alex
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: Di 30.09.03 17:10 
ähm...jetzt bin ich verwirrt.
Reicht der Source-code in den FAQs nicht? Da wird das nämlich alles gemacht, und deswegen ist der auch so lang.
Erst den id3v1Tag am Ende auslesen, dann gucken, ob ein v2 am Anfang is, dann den ersten mpeg-header auslesen, gucken, ob das ein XINGHeader ist, usw.
Einfach den Code rüber kopieren in dein Projekt, dann noch die variablen definieren, und etwas für die Ausgabe tun. Hab aber heute meinen guten Tag ;-) und deher ein Teil meines mp3Info-Programms, was die Daten in eine Memo auf einer zweiten Form ausgibt.,

ausblenden Delphi-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:
var filename:string;
    ID3v1Tag: TID3v1Tag;
    ID3v2Tag: TID3v2Tag;
    mpeginfo:TMpeginfo;
[...]
filename:='c:\my_music\dollesliedd.mp3'

//Aufruf der Funktion
mp3Info(filename,mpeginfo,ID3v2TAG,id3v1tag);

// Ausgabe der Daten
if mpeginfo.version<>3 then 
form2.memo1.lines.Add('MPEG'+inttostr(mpeginfo.version)+',Layer'+inttostr(mpeginfo.layer)) 
else form2.memo1.lines.Add('MPEG2.5, Layer'+inttostr(mpeginfo.layer));

form2.memo1.lines.Add('Bitrate: '+inttostr(mpeginfo.bitrate)+'kbit/s; '+ inttostr(mpeginfo.frames)+' Frames');
form2.memo1.Lines.add('Samplerate: '+inttostr(mpeginfo.samplerate));

form2.memo1.lines.Add('Spieldauer: '+inttostr(mpeginfo.dauer)+' Sekunden');

form2.memo1.Lines.add('');
form2.memo1.Lines.add('         Id3v1 Informationen ');
form2.memo1.lines.Add('Artist: '+id3v1tag.Artist);
form2.memo1.lines.Add('Titel: '+id3v1tag.Titel);
form2.memo1.lines.Add('Album: '+id3v1tag.Album);
form2.memo1.Lines.add('');
form2.memo1.Lines.Add('         Id3v2 Informationen');
form2.memo1.lines.Add('Artist: '+ID3v2TAG.Artist);
form2.memo1.lines.Add('Titel: '+ID3v2TAG.titel);
form2.memo1.lines.Add('Album: '+ID3v2TAG.album);


Das sollte jetzt aber wirklich klar sein....

_________________
We are, we were and will not be.
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mi 01.10.03 09:09 
Titel: Danke
danke gausi, es geht ja auch jetzt alles
muss nur noch die umrechnung von sekunden in minuten vornehmen aber keine angst das bekomme ich hin
danke nochmals
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mi 01.10.03 11:44 
Titel: mal noch ne frage
gausi hab mal noch ne frage. es geht ja alles aber wie lese ich z.B. die länge einer *.avi (DIVX) datei aus? geht ja schlecht mit dem quellcode
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: Mo 06.10.03 13:37 
Tut mir leid, aber da hab ich absolut keine Ahnung. Probier mal, ob du etwas über den Aufbau eines avi was findest. Da muss es ja auch irgendwelche Header geben, in denen Informationen zum Bild und zu Ton drin stehen. Schau mal bei www.wotsit.org, das wäre mal ein Anfang.

_________________
We are, we were and will not be.
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mo 06.10.03 14:15 
Titel: danke
danke ich werde mal nachschauen und ich hoffe ich hab erfolg
miko19
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 20.11.03 15:49 
Titel: ?
Wie währs mit einer Komponente mit den funktionen?
Kanns jemand machen? :?: