Hallo Allerseits.
Ich stelle nun hier mal eine stark abgespeckte Version meines Programms rein.
Vieleicht hat ja der eine oder die andere Lust, damit etwas zu "spielen".
Benötigt wird natürlich ein zweiter Monitor. Weil dort der Fehler auftritt. Man kanns aber auch so laufen lassen.
(Bei mir der Fernseher via HDMI).
Installiert habe ich das Codecpack K-Lite Version 1860mega.
Als Testvideo nehme ich eine Musik- Filmdatei von einem Konzert.
Länge: 06.44 min, 92,1 Mb.
Die Chance das es läuft ist hoch, wenn ich das Video etwas laufen lasse, bevor ich es neu starte.
Das Programm kennt die Tasten.
Taste F und die Rechts Taste.
Taste F schaltet das Fenster.
wird das Fenster in der grösse geändert. Vollbild, Normalbild.
B: Ist die Maus auf dem anderen Desktop, wird das Fenster auf den Dektop gezogen, wo die Maus ist.
Rechts Taste startet das Video wieder neu.
Mit den Tasten "F1 / F2" kann man auswählen, ob der aktuelle Film wiederholt wird oder ob man nach jedem Filmende einen Neuen auswählt.
Mit der Taste "n" kann man jederzeit abbrechen und einen neuen Film auswählen.
Das ich den tempMCI name immer wieder umschalte ist beabsichtigt. Zum einen wegen der Überlegung, ob window dort immer hängen bleibt, weil es die Ausgabe nicht richtig vom Renderobjekt trennt,
zum anderen hat es den Vorteil, mehrere Medien laufen lassen zu können (z.B. auch in einem Vorschaufenster).
Vieleicht findet ja jemannd den Fehler, warum das Video auf dem 2ten Desktop immerwieder nicht zu starten ist und sich in der Play- Funktion aufhängt.
Enumeration window
#hwnd
EndEnumeration
Enumeration gadgets
#MCI_Gadget
EndEnumeration
#ansicht_Normal = 0
#ansicht_vollbild = 1
Structure medium_struct
name$
x.i
y.i
w.i
h.i
speed.i
zoom.i
scrollpos_x.i
scrollpos_y.i
spiele_aus_liste.i
bild_einblenden.i
playlist.i
mci_pos.q
sound_onoff.i
EndStructure
Global medium.medium_struct
;----- Global
Global MCI_Geladen
Global TempMCI.s, TempMCI_alt.s
Global ansicht
Macro Rahmen_Aus(wnd)
SetWindowLongPtr_(WindowID(#hwnd), #GWL_STYLE, GetWindowLongPtr_(WindowID(#hwnd), #GWL_STYLE) &~ (#WS_DLGFRAME | #WS_BORDER | #WS_SIZEBOX))
EndMacro
Macro Rahmen_An(wnd)
SetWindowLongPtr_(WindowID(#hwnd), #GWL_STYLE, #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_CAPTION | #WS_SYSMENU|#WS_SIZEBOX|#WS_MAXIMIZEBOX|#WS_MINIMIZEBOX|#WS_EX_TOPMOST)
;SetWindowPos_(WindowID(wnd), 0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
EndMacro
Procedure stop(a$)
MessageRequester("",a$)
EndProcedure
Procedure.s GetMciFileTypes(file$)
Protected Retval.i, Buffer.s
Select LCase(GetExtensionPart(File$))
Case "vob", "avi", "asf", "asx", "mpg", "m2v", "p2v", "mp4", "lsf", "lsx", "nsv", "mpeg", "dat", "wmv", "wax", "wvx", "wm", "wmx", "wmp", "webm"
DeviceType$ = "MPEGVIDEO";"MPEGVideo" ;
Case "mp3", "kar", "miz", "mod", "mdz", "nst", "stm", "stz", "s3m", "s3z", "it", "itz", "xm", "xmz", "mtm", "ult", "669", "far", "amf", "okt"
DeviceType$ = "MPEGVideo"
Case "ptm", "mp2", "mp1", "aac", "apl", "vlb", "m4a", "nsa", "ogg", "voc", "au", "snd", "aif", "aiff", "wma", "pls","flv"
DeviceType$ = "MPEGVideo"
Case "wav", "wave"
DeviceType$ = "MPEGVideo"; 'WaveAudio
Case "img" , "jpg" , "png" , "bmp", "gif"
DeviceType$ = "image" ;"MPEGVideo"
Case "mid", "midi", "rmi"
DeviceType$ = "Sequencer"
Case "cda"
DeviceType$ = "cdaudio"
Case "rm", "ram", "ra"
;DeviceType = eMCI_RealPlayer
DeviceType$ = "other"
Case "ivf"
DeviceType$ = "MPEGVIDEO2"
Case "txt"
DeviceType$ = "text"
Case "xspf"
DeviceType$ = "unbekannt"
Case "db"
DeviceType$ = "datenbank"
Default
If FileSize(File$) = -2
DeviceType$ = "ordner"
Else
DeviceType$ = "unbekannt" ;"MPEGVIDEO" ;"MPEGVideo" ;
EndIf
EndSelect;
;Debug DeviceType$
ProcedureReturn DeviceType$;Buffer
EndProcedure
Procedure MCI_Load(sFile.s)
Protected sBuffer.s = Space(255)
Protected sType.s
Protected nResult.l
Protected bVideo.i
; Falls noch ein Video ge?ffnet ist
If MCI_Geladen
;mciSendString_("close TempMCI", 0, 0, 0)
mciSendString_("close " + TempMCI_alt, 0, 0, 0)
;Delay(1000)
EndIf
MCI_Geladen = 0
Img_Geladen = 0
; --- Multimedia-Typ ermitteln
sType.s = GetMciFileTypes(sFile)
; --- kurzen Dateinamen ermitteln
a = GetShortPathName_(sFile, sBuffer, Len(sBuffer))
sFile = Left(sBuffer, a)
;Debug sFile
;HideGadget(#mci_gadget, 1)
open$ = "open " + Chr(34) + sFile + Chr(34) + " type " + sType + " alias " + tempMCI
fehler = mciSendString_(open$, 0, 0, 0)
Debug open$
If fehler : stop("Kann Datei" + #LF$ + sFile + #LF$ + " nicht öffnen") : EndIf
If fehler : ProcedureReturn fehler : EndIf
; --- Zeitformat auf Millisekunden einstellen
mciSendString_("set " + TempMCI + " time format milliseconds", #Null, #Null, #Null)
; --- AnzeigeFenster (Gadget) angeben
;mciSendString_("window " + TempMCI + " handle " + Str(WindowID(#hwnd)), 0,0,0)
fehler = mciSendString_("window " + TempMCI + " handle " + Str(GadgetID(#mci_gadget)), 0,0,0)
If fehler : Debug "Rendern Fehlgeschlagen " + Str(fehler) : EndIf
MCI_Geladen = 1
TempMCI_alt = TempMCI
ProcedureReturn fehler
EndProcedure
Procedure MCI_Stop()
flError = mciSendString_("stop " + TempMCI, 0, 0, 0)
EndProcedure
Procedure MCI_IsMoviePlaying()
; Gibt zurück, ob das Video läuft
Protected sBuffer.s = Space(255)
mciSendString_("status " + TempMCI + " mode", sBuffer, Len(sBuffer), 0)
If Left(sBuffer, 7) = "playing"
ProcedureReturn #True
Else ; : Debug sBuffer
ProcedureReturn #False
EndIf
EndProcedure
Procedure MCI_SetVideoSize(X, Y, W, H)
a$ = Str(X) + " " + Str(Y) + " " + Str(W) + " " + Str(H) + " "; + Chr(0)
mciSendString_("put " + TempMCI + " destination at " + a$, 0, 0, 0)
EndProcedure
Procedure MCI_PlayAtPosition(llMS.q)
; Setzt Position des Videos
Debug "Play Starten"
fehler = mciSendString_("play " + TempMCI + " from " + Str(llMS), 0, 0, 0)
;fehler = mciSendString_("put " + TempMCI + " destination", 0, 0, 0)
Debug "Fehler = " + Str(fehler)
Debug "Play Gestartet"
EndProcedure
Procedure MCI_GetVideoSize(*medium.medium_struct)
Protected sBuffer.s = Space(255)
mciSendString_("where " + TempMCI + " destination", sBuffer, Len(sBuffer), 0)
*medium\w = Val(StringField(sBuffer, 3, " "))
*medium\h = Val(StringField(sBuffer, 4, " "))
;Debug sBuffer
EndProcedure
Procedure.l GetPositionInFrames()
; Aktuelle Position in Frames
fsData.s = Space(128)
flError = mciSendString_("set " + TempMCI + " time format frames wait", 0, 0, 0);:Debug flError
flError = mciSendString_("status " + TempMCI + " position", fsData, 128, 0)
GetPositionInFrames.l = Val(fsData)
ProcedureReturn GetPositionInFrames
EndProcedure
;-
Procedure Get_Desktop_mit_der_Maus(desktops)
For i = desktops - 1 To 0 Step -1
If DesktopMouseX() => DesktopX(i)
ProcedureReturn i
EndIf
Next
ProcedureReturn 0
EndProcedure
Procedure Get_Desktop_mit_dem_Fenster(desktops)
For i = desktops - 1 To 0 Step -1
If WindowX(#hwnd) => DesktopX(i)
ProcedureReturn i
EndIf
Next
ProcedureReturn 0
EndProcedure
;-
Procedure resize_mcigadget(winw , winh); : Debug "resize_mcigadget"
If medium\w = 0 And medium\h = 0 : ProcedureReturn 0 : EndIf
Protected fx.d , fy.d
Debug medium\w
Debug medium\h
;winw + zoom
;winh + zoom * (winh/winw)
fx = winw / medium\w
h = medium\h * fx
If h > winh
y = 0
fy = winh / medium\h
w = medium\w * fy
x = (winw - w) / 2
h = winh
Else
y = (winh - h) / 2
w = winw
x = 0
EndIf
Debug "Position :"
Debug "x:" + Str(x) + " y:" + Str(y) + " w:" + Str(w) + " h:" + Str(h)
;ResizeGadget(#mci_gadget,10,10,WindowWidth(#hwnd)-20,WindowHeight(#hwnd)-20)
MCI_SetVideoSize(x+10, y+10, w-20, h-20)
;MCI_SetVideoSize(10,10,GadgetWidth(#MCI_Gadget)-20, GadgetHeight(#MCI_Gadget)-20)
EndProcedure
;-
;----- Fenster Proceduren
Procedure Window_Open()
fl = #PB_Window_SystemMenu
fl | #PB_Window_MinimizeGadget
fl | #PB_Window_MaximizeGadget
OpenWindow(#hwnd, 50,50,500,300,"Test Movie", fl)
SetWindowColor(#hwnd, #Red)
;ImageGadget(#MCI_Gadget, 0, 0, WindowWidth(#hwnd), WindowHeight(#hwnd),0)
CanvasGadget(#MCI_Gadget, 0, 0, WindowWidth(#hwnd), WindowHeight(#hwnd),0)
;Delay(2000)
desk = ExamineDesktops()
deskwin = 0
; x = DesktopX(deskwin)
; y = DesktopY(deskwin)
; w = DesktopWidth(deskwin)
; h = DesktopHeight(deskwin)
; rahmen_aus(#hwnd)
x = DesktopX(deskm) + 100
y = DesktopY(deskm) + 50
w = 500
h = 300
ansicht = #ansicht_Normal
rahmen_an(#hwnd)
ResizeWindow(#hwnd, x,y,w,h)
w = WindowWidth(#hwnd);, #PB_Window_InnerCoordinate)
h = WindowHeight(#hwnd);, #PB_Window_InnerCoordinate)
ResizeGadget(#MCI_Gadget, 10, 10, w-20,h-20)
TempMCI = "TempMCI_1"
EndProcedure
Procedure.s Movie_Laden(file$)
; Bietet Raum für eigene Erweiterungen.
titel$ = "Neuer Film"
StandardDatei$ = file$
Pattern$ = "Alle Dateien | *.*"
PatternPosition = 0
file$ = OpenFileRequester(Titel$, StandardDatei$, Pattern$, PatternPosition , 0)
ProcedureReturn file$
EndProcedure
;-===== Start
Window_Open()
laufen_lassen = 1 ; Hier zum ausprobieren anpassen.
If laufen_lassen ; Einmal auswählen, danach startet das selbe Movie immer wieder.
a$ = Movie_Laden(file$)
If a$ = "" : End : EndIf
file$ = a$
wiederholung = -1
EndIf
Repeat
If Not MCI_IsMoviePlaying()
If Not laufen_lassen
a$ = Movie_Laden(file$)
If a$ = "" : End : EndIf
file$ = a$
wiederholung = 0
Else
wiederholung + 1
EndIf
durchlauf + 1
Debug " "
Debug "Durchlauf " + Str(durchlauf) + " gestartet"
If wiederholung = 0
Debug "Neuer Film ausgewählt"
Else
Debug "Wiederholung " + Str(wiederholung)
EndIf
If TempMCI = "TempMCI_1" : TempMCI = "TempMCI_2" : Else : TempMCI = "TempMCI_1" : EndIf
MCI_Stop()
MCI_Load(file$)
MCI_GetVideoSize(@medium)
;Debug medium\w
;Debug medium\h
resize_mcigadget(GadgetWidth(#MCI_Gadget) , GadgetHeight(#MCI_Gadget))
MCI_PlayAtPosition(0)
EndIf
ev = WaitWindowEvent(20)
Select ev
Case #PB_Event_CloseWindow
ende = 1
Case #WM_KEYDOWN
;Debug EventwParam()
Select EventwParam()
Case #VK_ESCAPE
ende = 1
Case #VK_F1
laufen_lassen = 0
Debug "Nach jedem Movie- Ende neu auswählen"
Case #VK_F2
laufen_lassen = 1
Debug "Movie wird nach jedem Ende wiederholt"
Case #VK_N
MCI_Stop()
Debug "Durchlauf Abgebrochen"
a$ = Movie_Laden(file$)
If a$ = "" : End : EndIf
file$ = a$
durchlauf + 1
Debug " "
Debug "Durchlauf " + Str(durchlauf) + " gestartet"
Debug "Neuer Film ausgewählt"
wiederholung = 0
If TempMCI = "TempMCI_1" : TempMCI = "TempMCI_2" : Else : TempMCI = "TempMCI_1" : EndIf
MCI_Load(file$)
MCI_GetVideoSize(@medium)
resize_mcigadget(GadgetWidth(#MCI_Gadget) , GadgetHeight(#MCI_Gadget))
MCI_PlayAtPosition(0)
Case 176 , #VK_RIGHT;---- Taste Nächstes Movie
If TempMCI = "TempMCI_1" : TempMCI = "TempMCI_2" : Else : TempMCI = "TempMCI_1" : EndIf
;MCI_Stop()
MCI_Load(file$)
MCI_GetVideoSize(@medium)
;Debug medium\w
;Debug medium\h
resize_mcigadget(GadgetWidth(#MCI_Gadget) , GadgetHeight(#MCI_Gadget))
MCI_PlayAtPosition(0)
Case 70 ;---- Taste F
desktops = ExamineDesktops()
; --- Auf welchem Desktop ist die Maus
deskm = Get_Desktop_mit_der_Maus(desktops)
; --- Auf welchem Desktop ist das Fenster
deskw = Get_Desktop_mit_dem_Fenster(desktops)
; --- Die Bindings abschalten um Flackern zu verhindern
;UnbindEvent(#PB_Event_MoveWindow, @SizeWindowHandler(), #hwnd)
;UnbindEvent(#PB_Event_SizeWindow, @SizeWindowHandler(), #hwnd)
;HideWindow(#hwnd, 1)
If deskm <> deskw ; --- Desktops sind unterschiedlich
; --- Fenster auf Mausdesktop hohlen
x1 = WindowX(#hwnd) - DesktopX(deskw)
y1 = WindowY(#hwnd) - DesktopY(deskw)
x = DesktopX(deskm) + x1
y = DesktopY(deskm) + y1
w = WindowWidth(#hwnd)
h = WindowHeight(#hwnd)
Else
; --- Fenstergröße ändern
If ansicht = #ansicht_vollbild
x = DesktopX(deskm) + 100
y = DesktopY(deskm) + 50
w = 500
h = 300
ansicht = #ansicht_Normal
rahmen_an(#hwnd)
Else
x = DesktopX(deskm)
y = DesktopY(deskm)
w = DesktopWidth(deskm)
h = DesktopHeight(deskm)
ansicht = #ansicht_vollbild
rahmen_aus(#hwnd)
EndIf
EndIf
; --- Erledigt
ResizeWindow(#hwnd,x, y, w, h)
ResizeGadget(#mci_gadget,10,10,WindowWidth(#hwnd)-20,WindowHeight(#hwnd)-20)
resize_mcigadget(GadgetWidth(#MCI_Gadget) , GadgetHeight(#MCI_Gadget))
;BindEvent(#PB_Event_MoveWindow, @SizeWindowHandler(), #hwnd)
;BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler(), #hwnd)
SetActiveWindow(#hwnd)
EndSelect
EndSelect
Until ende