Autor |
Beitrag |
GR-Thunderstorm
      
Beiträge: 206
|
Verfasst: Mi 29.11.06 10:52
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! 
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 29.11.06 11:04
Auch wenn es evtl. etwas Overkill ist: Hiermit 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.
Mediaplayer.length könnte auch gehen, ist aber langsamer.
_________________ We are, we were and will not be.
|
|
GR-Thunderstorm 
      
Beiträge: 206
|
Verfasst: 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); |
Zuletzt bearbeitet von GR-Thunderstorm am Mi 29.11.06 14:11, insgesamt 1-mal bearbeitet
|
|
GR-Thunderstorm 
      
Beiträge: 206
|
Verfasst: 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
Hält's aus hier
Beiträge: 1
|
Verfasst: 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
Hält's aus hier
Beiträge: 8
Erhaltene Danke: 2
Win XP, Win 7
Delphi 7 PE, Delphi 10 Pro.
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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 1000) mod 60; Min := (MSE div 60000) mod 60; Stu := Min div 60; MSe := MSe mod 1000;
Result:=IntToStr(Stu)+':'+IntToStr(Min)+':'+IntToStr(Sek)+','+IntToStr(MSe); end; |
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Zuletzt bearbeitet von elundril am Fr 06.08.10 16:31, insgesamt 2-mal bearbeitet
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 06.08.10 16:05
... was in etwa das ist, was hugo_der_zweite im Jahre 2007 geschrieben hat. 
_________________ We are, we were and will not be.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 06.08.10 16:08
Ne, er hat den Mod-Operator nicht gewusst.  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.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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? 
_________________ We are, we were and will not be.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 06.08.10 16:12
 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.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Zuletzt bearbeitet von elundril am Fr 06.08.10 16:21, insgesamt 1-mal bearbeitet
|
|
Milchbubi
Hält's aus hier
Beiträge: 8
Erhaltene Danke: 2
Win XP, Win 7
Delphi 7 PE, Delphi 10 Pro.
|
Verfasst: 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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 06.08.10 16:27
hugo_der_zweite hat folgendes geschrieben : |
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)
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 06.08.10 16:35
Milchbubi hat folgendes geschrieben : | 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.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Milchbubi
Hält's aus hier
Beiträge: 8
Erhaltene Danke: 2
Win XP, Win 7
Delphi 7 PE, Delphi 10 Pro.
|
Verfasst: Fr 06.08.10 16:36
Sorry, dass hatte ich übersehen.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
|
|