Entwickler-Ecke

Multimedia / Grafik - Länge einer Musikdatei auslesen?


GR-Thunderstorm - Mi 29.11.06 10:52
Titel: Länge einer Musikdatei auslesen?
Hi
Kurz und knapp:
Wie kann ich die Dauer einer .mp3 Datei in Delphi auslesen und im Format mm:ss anzeigen?
Ist mediaplayer.length geeignet dafür?

Danke! :wink:


Gausi - Mi 29.11.06 11:04

Auch wenn es evtl. etwas Overkill ist: Hiermit [http://www.delphi-forum.de/topic_MP3FileUtils_51410.html] geht es.

Wenn du wirklich nur die Länge haben willst, und dich der Rest (ID3Tag) nicht interessiert, kannst du ca. 90% der Unit löschen und nur den MPEG-Teil nutzen ;-).

Es ist allerdings sinnvoll, den ID3v2Tag zumindest rudimentär auszulesen (d.h. den Header lesen und ans Ende des Tags springen). Denn wenn du den ID3Tag ignorierst, könnte es passieren, dass die Routinen dort unter Umständen für gewisse, äußerst exotische Mp3s einen komplett falschen Wert liefern. :mrgreen:


Mediaplayer.length könnte auch gehen, ist aber langsamer.


GR-Thunderstorm - Mi 29.11.06 11:37

Danke aber das ist doch etwas lang...

Wenn ich einfach player.length nehme, liest er dann die Länge der Musikdatei in Millisekunden aus?

Wenn ich folgendes mache, steht am Ende in meinem Editfenster eine Zahl im 100.000er bereich:


Delphi-Quelltext
1:
2:
mediaplayer.FileName:='lied.mp3';
edit1.Text:=inttostr(mediaplayer.Length);


GR-Thunderstorm - Mi 29.11.06 13:45

Hab grade eine neue Idee.
Kann man irgendwie prüfen, ob im Mediaplayer zur Zeit eine Datei wiedergegeben wird? Dies wäre im Prinzip für mein Programm viel eher von Nutzen.


hugo_der_zweite - Do 10.05.07 19:24

Hallo,
ich komm zwar aus der C-,C#-Ecke aber ich denke bei deinem Problem gibts nicht so viel Unterschied.
Also mediaplayer.Length ist schon die Zeit aber in Millisekunden.
Die musst Du nur noch umwandeln.

in etwa so

int sek = ediaplayer.Length/1000;
int min = sek/60;
sek = sek%60; // % bedeuted modulo (Rest) ich weis nicht wie das in delphi ausschaut

mfg hugo


Milchbubi - Fr 06.08.10 15:52

Hallo

Hier habe ich eine Funktion:


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:
function MSekToSek(MSe : integer) : String;
var Sek : Integer;
    Min : Integer;
    Stu : Integer;
begin
Sek := 0;
Min := 0;
Stu := 0;

while MSe >= 1000 do
 begin
 Inc(Sek);
 MSe:=MSe-1000;
 end;

while Sek >= 60 do
 begin
 Inc(Min);
 Sek:=Sek-60;
 end;

while Min >= 60 do
 begin
 Inc(Stu);
 Min:=Min-60;
 end;
Result:=IntToStr(Stu)+':'+IntToStr(Min)+':'+IntToStr(Sek)+','+IntToStr(MSe);
end;


Einfach aufrufen

Delphi-Quelltext
1:
Edit1.Text:=MsekToSek(MediaPlayer.Length);                    


mfg Milchbubi


elundril - Fr 06.08.10 16:01

und hier die gleiche funktion etwas schöner:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function MSekToSek(MSe : integer) : String;
var Sek : Integer;
    Min : Integer;
    Stu : Integer;
begin
  Sek := (MSe div 1000mod 60;
  Min := (MSE div 60000mod 60;
  Stu := Min div 60;
  MSe := MSe mod 1000;

  Result:=IntToStr(Stu)+':'+IntToStr(Min)+':'+IntToStr(Sek)+','+IntToStr(MSe);
end;


Gausi - Fr 06.08.10 16:05

... was in etwa das ist, was user profile iconhugo_der_zweite im Jahre 2007 geschrieben hat. :zwinker:


elundril - Fr 06.08.10 16:08

Ne, er hat den Mod-Operator nicht gewusst. :mrgreen: weiters wollte ich damit eher Milchbubi darauf hinweisen das die 3 Schleifen nichts anderes Machen als ne Division zu simulieren und somit absolut unzulässig sind in Delphi, da man ja den div operator hat und der eindeutig mehr sinn macht und sicher schneller ist.


Gausi - Fr 06.08.10 16:10

Und warum nimmst du dann nicht den DIV-Operator, sondern diesen /, der so in Delphi bei Integer nicht geht? :mrgreen:


elundril - Fr 06.08.10 16:12

:oops: kann ja mal passieren, bin auch nicht perfekt. ;) wobei ich gerade draufgekommen bin das es auch sonst n paar mod-operatoren fehlen. sonst bekommst man bei sekunden nicht die sekunden die übrig bleiben sondern allgemein die liedlänge auf sekunden gerundet. ich nehm an jeder weiß selbst wie das dann zu rechnen ist.


Milchbubi - Fr 06.08.10 16:20

Achtung beim teilen wenn es um Zeiten geht.

Ausgangswert is jeweils 100.000
bei meiner Formel kommt 0:1:40,0 raus.
Bei einer Formel in der man Teilt kommt 0:1:100,0 raus.

mfg Milchbubi


Xion - Fr 06.08.10 16:27

user profile iconhugo_der_zweite hat folgendes geschrieben Zum zitierten Posting springen:

Also mediaplayer.Length ist schon die Zeit aber in Millisekunden.


Bei mir zeigt MediaPlayer.Length meist die Hälfte von der tatsächlichen Spielzeit an. Das hat irgendwas mit der variablen Datenrate zu tun. Bei mir gehts auf jeden Fall nicht ordentlich ;) (Delphi 2005, Win XP...max SP1)


elundril - Fr 06.08.10 16:35

user profile iconMilchbubi hat folgendes geschrieben Zum zitierten Posting springen:
Achtung beim teilen wenn es um Zeiten geht.

Ausgangswert is jeweils 100.000
bei meiner Formel kommt 0:1:40,0 raus.
Bei einer Formel in der man Teilt kommt 0:1:100,0 raus.

mfg Milchbubi


Deswegen muss man sich etwas mit dem Mod-Operator spielen, siehe verbesserten Post von mir oben.


Milchbubi - Fr 06.08.10 16:36

Sorry, dass hatte ich übersehen.


delfiphan - Sa 07.08.10 08:18

Wenn deine Zielplatform Vista+ ist, gibt es dort eine DLL, welche Explorer verwendet, um die Länge und ähnliche Informationen darzustellen. Die kannst du verwenden. -> propsys.dll