Länge einer Mediendatei ermitteln [WinAPI]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von RSBasic »

Mit diesem Code kann die Länge einer Audio-Datei ermitteln werden.
Falls jemand sowas braucht:

Code: Alles auswählen

EnableExplicit

Procedure GetAudioFileLength(Path$)
  Protected AudioFileLength$ = Space(256)
  
  ;Audio-Datei öffnen
  mciSendString_("open " + Chr(34) + Path$ + Chr(34) + " type MPEGVideo alias mp3audio", #Null, #Null, #Null)
  ;Länge der Audio-Datei ermitteln, Wert wird in Millisekunden als String zurückgegeben
  mciSendString_("status mp3audio length", @AudioFileLength$, 256, #Null)
  ;Geöffnete Audio-Datei schließen
  mciSendString_("close mp3audio", #Null, #Null, #Null)
  
  ProcedureReturn Val(AudioFileLength$)/1000
EndProcedure

MessageRequester("","Länge der Audio-Datei in Sekunden: "+Str(GetAudioFileLength("C:\...\Datei.mp3")),0);Formate getestet: wav, wma, mp3

;mciSendString: http://msdn.microsoft.com/en-us/library/dd757161%28v=vs.85%29.aspx
;Übersicht der Befehle: http://msdn.microsoft.com/en-us/library/dd743572%28v=vs.85%29.aspx
;open: http://msdn.microsoft.com/en-us/library/dd743638%28v=vs.85%29.aspx
;status: http://msdn.microsoft.com/en-us/library/dd798683%28v=vs.85%29.aspx
;close: http://msdn.microsoft.com/en-us/library/dd797784%28v=vs.85%29.aspx
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Länge einer Audio-Datei ermitteln [WinAPI]

Beitrag von bobobo »

geht bei mich auch mit ogg-zeug und avi-videos und mpg (da wird aber natürlich was falsches
zurückgeliefert), wmv

threadTitle sollte geändert werden 'Länge einer Multimediadatei ermitteln' oder so
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
LoD
Beiträge: 9
Registriert: 26.08.2008 19:30

Re: Länge einer Audio-Datei ermitteln [WinAPI]

Beitrag von LoD »

Bei manchen Liedern stürzt das Programm bei der Open-Anweisung in Zeile 7 einfach ab (Ungültiger Speicherzugriff)
Weiß jemand an was das liegt? Oder wie ich zumindest den Absturz verhindern kann?

Ein Beispiellied für den Fehler ist übrigens "Lords of the Sky" von Aeon 3, was man hier runterladen kann.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Länge einer Audio-Datei ermitteln [WinAPI]

Beitrag von ts-soft »

Hier: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
die Errorconstanten, sollten in PB vordefiniert sein.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
LoD
Beiträge: 9
Registriert: 26.08.2008 19:30

Re: Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von LoD »

Die Errorconstanten kenne ich, aber soweit komm ich gar nicht.
Das Programm stürzt bereits ab, wenn ich

Code: Alles auswählen

mciSendString_("open " + Chr(34) + Path$ + Chr(34) + " type MPEGVideo alias mp3audio", #Null, #Null, #Null)
mit dem Pfad zu einem der betroffenen Lieder ausführe...
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von c4s »

Vielleicht ist diese Datei kein "MPEGVideo"?

Hiermit kannst du den richtigen Type herausfinden bzw. sehen ob deine Datei überhaupt unterstützt wird:

Code: Alles auswählen

Procedure.s MCITypeOfName(Filename.s)
	Protected Type.s = Space(#MAX_PATH)

	GetProfileString_("mci extensions", GetExtensionPart(Filename), "NotFound", @Type, #MAX_PATH)
	If Type = "NotFound" : Type = "" : EndIf

	ProcedureReturn Type
EndProcedure

Debug MCITypeOfName("test.abc")
Debug MCITypeOfName("test.wav")
Debug MCITypeOfName("test.mp3")
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
LoD
Beiträge: 9
Registriert: 26.08.2008 19:30

Re: Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von LoD »

Als Type bekomme ich MPEGVideo. Ist wohl leider auch nicht die Lösung.
Der Fehler tritt nur bei einer handvoll Liedern auf, aber ich kann einfach keine Gemeinsamkeiten erkennen.
Keine Sonderzeichen im Pfad und andere Player/Taggingprogramme/... haben auch keine Probleme damit..
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von DarkDragon »

Hast du irgendwelche dubiosen Codec Packs oder ffdshow installiert? Die sind fast alle miserabel programmiert, wodurch es sehr oft zu abstürzen kommt.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
LoD
Beiträge: 9
Registriert: 26.08.2008 19:30

Re: Länge einer Mediendatei ermitteln [WinAPI]

Beitrag von LoD »

Daran liegts wohl! Ich arbeite zur Zeit am Computer meiner Freundin, weil mich meiner boykottiert. Da will ich jetzt nicht einfach die Codecs deinstallieren..
Aber nachdem der Code mit dem Lied auf einem anderen Computer nicht abstürzt, liegts auf jeden Fall am System.
Aber gibts ne Möglichkeit, dass ich den Absturz bei fehlerhaften Codecs irgendwie verhindern kann, ohne auf die MCI-Befehle verzichten zu müssen?


EDIT: Wen's interessiert:
Ich hab mich jetzt doch mal an die Codecs rangemacht und auch den Schuldigen ausfindig machen können. Es lag weder an ffdShow noch am dubiosen (K-Lite) Codecpack, sondern an der Nokia PC Suite, mit der meine Freundin ihr Handy synchronisiert. Warum Nokia dafür (anscheinend fehlerhafte) Codecs installieren muss, werd ich wohl nicht verstehen...

Das Problem ist somit nun gelöst und ich befürchte für meine obige Frage gibts wohl keine Lösung.
Trotzdem danke an euch
Antworten