Nach längerer Abstinenz - letztes Projekt war "Ich/Wir baue(n) mir/uns ein CAD" - habe ich nun was Neues auf dem Tisch: Mediathek.
Um Videos (mpg-Dateien) auf dem PC wiedergeben zu können ist es am Einfachsten den bordeigenen MediaPlayer von Windows (WMP) zu benutzen - dachte ich jedenfalls zunächst.
Ähnlich wie bei EXCEL, oder auch TurboCAD sollte es doch auch beim WMP über die COM-Schnittstellen-DLL "wmp.dll" gehen. Die über 10MB grosse Datei läßt sich in einem COM-Browser auf vorhandene Klassen, Methoden, Eigenschaften und Ereignisse untersuchen. Leider kommen auf unterschiedlichen COM-Browsern auch unterschiedliche Ergebnisse. Ich habe es versucht mit:
- PowerBasic-COM Browser
- comTL-Browser von Holger Schwichtenberg
- COM-Browser aus dem VB2005-Studio
Am Einfachsten und ohne COM geht:
<Run("C:\Programme\Windows Media Player\wmplayer.exe", "", @SW_MAXIMIZE)/> oder
<ShellExecuteWait("wmplayer.exe")/> dann sollte noch
<WinWaitActive("Windows Media Player")/> folgen, sonst gehen die nachfolgenden "Send"-Funktionen nicht:
<Send("!df")
Send($Link & "{ENTER}")/>
In $Link ist Pfad und Datei des Videos enthalten. Das funktioniert auch, aber wie den WMP automatisch schließen, wenn das Video zu Ende ist?
Auch über:
<$exitCode = ShellExecuteWait($Link, "")/>
lässt sich der Status des WMP ("Play" oder "Stop") nicht ermitteln, weil es offensichtlich keine Rückgabe-Info gibt.
<While $exitCode = 0
WinClose("Windows Media Player", "")
WEnd/> funktioniert leider nicht so, weil offensichtlich immer $exitCode = 0 ist...
Ein Ausweg sollte die COM-Technologie sein, aber das Problem fängt dann schon beim COM-Aufruf unter AutoIt an.
Im COM-Browser wird die wmp.dll mit "WMPLib" bezeichnet. Das versteht die Referenzierung mit
<$WMPapp = ObjCreate("WMPLib.WindowsMediaPlayer")/> aber nicht, sondern - und diese Info habe ich aus dem PB_COM-Browser - mit diesem Aufruf:
<$WMPapp = ObjCreate("WMPlayer.OCX")/>
Zur Überprüfung dann Folgendes:
<If $WMPapp = -1 Then
MsgBox (0, "Fehler", "Die COM konnte nicht hergestellt werden")
Exit
Else
MsgBox(0, "Mediaplayer-Status", "Status = " & $WMPapp.PlayState + 1 & " ...." & @CRLF & " läuft, d.h. die COM-Schnittstelle zum Mediaplayer kann jetzt verwendet werden")
EndIf/>
Der Start ist dann über
<$WMPapp.OpenPlayer($Link)/> möglich und geht auch gleich los...
Anstelle dessen mit:
<$WMPapp.url = $Link
$WMPapp.controls.play()
$WMPapp.controls.stop()/>
haben keinerlei Auswirkung auf den laufenden WMP. Mit
<MsgBox(0, "Mediaplayer-Status", "PlayStatus = " & $WMPapp.PlayState)/>
kann man sich jederzeit den Status anzeigen lassen, auch das hier geht:
MsgBox(0, "Mediaplayer-Status", "OpenStatus = " & $WMPapp.OpenState())
MsgBox(0, "Mediaplayer-Status", "WMP-Version = " & $WMPapp.versionInfo())/>
Vieles Andere dagegen nicht - wie z.B. das wichtige
<$WMPapp.Close()/> wird ignoriert.
Der "Play-Status" ist unabhängig vom laufenden WMP, nur von den .controls-Befehlen - die aber, wie schon festgestellt, keine Auswirkungen auf den laufenden WMP haben.
Ohne den "openPlayer"-Befehl ist kein Video zu sehen!
Wo ist das Problem, bzw. die Lösung?
Gehe ich recht in der Annahme, dass sich die "WMPlayer.OCX"-Referenzierung nur auf ein GUI-Control bezieht? -
<$WMPapp = ObjCreate("MediaPlayer.MediaPlayer.1")/> geht zwar auch, bewirkt aber das Gleiche wie mit "WMPlayer.OCX".
Eine andere habe ich aber nicht zum Laufen gebracht...
Wäre eine DLL-Anbindung mit "DLL.Open"/"DLLCall" bei der "wmp.dll" eine Alternative?
Bin sehr gespannt auf Eure Vorschläge...
Grüsse aus Berlin
PSblnkd