Seite 2 von 3

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 01:44
von Sven
Hier eine lauffähige Kurzversion:

Code: Alles auswählen

If InitSprite() = 0
  End
Else
  If InitSprite3D() = 0
    End
  EndIf
EndIf
If InitMovie() = 0
  End
EndIf

wIDscrn.l = OpenWindow(#PB_Any, 10, 10, 640, 480, "Test")
OpenWindowedScreen(WindowID(wIDscrn), 0, 0, 640, 480, 1, 0, 0)
sID2d = CreateSprite(#PB_Any, 640, 480, #PB_Sprite_Texture)  ;Img-Sprite erzeugen
sID3d = CreateSprite3D(#PB_Any, sID2d)
ZoomSprite3D(sID3d, 640, 480)  ;Größe auf Screen anpassen
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)  ;bilineare Filterung für 3D-Sprites aktivieren

movfile.s = OpenFileRequester("Movie", "*.*", "*.*", 0)
mID = LoadMovie(#PB_Any, movfile)
xs = MovieWidth(mID)
ys = MovieHeight(mID)
msID = CreateSprite(#PB_Any, xs, ys)  ;Render-Movie-Sprite

MovieAudio(mID, 50, 0)

PlayMovie(mID, #PB_Movie_Rendered)  ;Movie-Rendern auf Sprite starten

tfps = ElapsedMilliseconds()

  Repeat
    Repeat
      EventID.l = WindowEvent()
      If EventID = #PB_Event_CloseWindow  ;Fenster schließen
        If IsMovie(mID)  ;wenn Movie vorhanden
          Debug "Movie free"
          FreeMovie(mID)  ;<= hier IMA, wenn Movie als gültig geladen aber nicht lauffähig
          FreeSprite(msID)
        EndIf
        movfile.s = OpenFileRequester("neues Movie laden, Abbrechen mit Cancel", "*.*", "*.*", 0)
        If movfile <> ""
          mID = LoadMovie(#PB_Any, movfile)
          If IsMovie(mID)
            Debug "Movie ok"
            xs = MovieWidth(mID)
            ys = MovieHeight(mID)
            Debug Str(xs) + ":" + Str(ys)
            msID = CreateSprite(#PB_Any, xs, ys)  ;Render-Movie-Sprite neue Größe
            PlayMovie(mID, #PB_Movie_Rendered)  ;Movie-Rendern auf Sprite starten
          Else
            Debug "Movie fehler"
          EndIf
        EndIf
      EndIf
    Until Event = 0

    If IsMovie(mID)  ;wenn Movie vorhanden
      RenderMovieFrame(mID, SpriteID(msID))  ;Movie auf Render-Sprite rendern
      UseBuffer(sID2d)
      DisplaySprite(msID, 0, 0)  ;Render-Sprite auf neues Sprite
      ;das Render-Sprite wird für Alpha-Blending und Zoom auf ein neues Texture-Sprite kopiert
      UseBuffer(#PB_Default)

      Start3D() 
        DisplaySprite3D(sID3d, 0, 0, 255) 
        ;hier noch andere Sprite-3D-Funktionen wie darübergelegter Text
      Stop3D()

      If StartDrawing(ScreenOutput())
        DrawText(10, 10, Str(tfps))
        StopDrawing()
      EndIf
    
      tgap.q = (1000 / 30) - (ElapsedMilliseconds() - tfps)
      If tgap > 16  ;wenn länger als 16 ms bis nächsten Frame
        If tgap > 100
          tgap = 100
        EndIf
        Delay(tgap - 10)  ;Pause einfügen für CPU-Entlastung
      EndIf

      FlipBuffers(#PB_Screen_SmartSynchronization) 
      tfps = ElapsedMilliseconds()  ;aktuelle Zeit holen
    EndIf
    
  Until exit
  
End
Als "Movie" können auch BMPs oder JPGs geladen werden.

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 01:50
von jojo1541
An IsMovie() sehe ich hier keinen Fehler, eher daran, dass FreeMovie() mit unbekannten Typen nicht klarkommt.

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 02:08
von Sven
Das passiert übrigens auch, wenn ich das Programm mit einem "End" nach einem ungültigen Video beenden lasse. Dann bringt das End beim Aufräumen den IMA.

Ärgerlich ist aber schon, das IsMovie ein OK zurückgibt, obwohl sich das Video nicht abspielen läßt (falscher Codec oder was auch immer). Wie soll ich da bitte abfangen, ob ein Video überhaupt gespielt werden kann...

Und warum bitte passiert das nur, wenn ich das Movie rendere. Bei normalen PlayMovie auf Window laufen die gleichen Videos nicht, aber FreeMovie bringt keinen IMA.

Code: Alles auswählen

If InitSprite() = 0
  End
Else
  If InitSprite3D() = 0
    End
  EndIf
EndIf
If InitMovie() = 0
  End
EndIf

wIDscrn.l = OpenWindow(#PB_Any, 10, 10, 640, 480, "Test")
OpenWindowedScreen(WindowID(wIDscrn), 0, 0, 640, 480, 1, 0, 0)
; sID2d = CreateSprite(#PB_Any, 640, 480, #PB_Sprite_Texture)  ;Img-Sprite erzeugen
; sID3d = CreateSprite3D(#PB_Any, sID2d)
; ZoomSprite3D(sID3d, 640, 480)  ;Größe auf Screen anpassen
; Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)  ;bilineare Filterung für 3D-Sprites aktivieren

movfile.s = OpenFileRequester("Movie", "*.*", "*.*", 0)
mID = LoadMovie(#PB_Any, movfile)
; xs = MovieWidth(mID)
; ys = MovieHeight(mID)
; msID = CreateSprite(#PB_Any, xs, ys)  ;Render-Movie-Sprite

MovieAudio(mID, 50, 0)

; PlayMovie(mID, #PB_Movie_Rendered)  ;Movie-Rendern auf Sprite starten
PlayMovie(mID, WindowID(wIDscrn))  ;Movie-Rendern auf Sprite starten

tfps = ElapsedMilliseconds()

  Repeat
    Repeat
      EventID.l = WindowEvent()
      If EventID = #PB_Event_CloseWindow  ;Fenster schließen
        If IsMovie(mID)  ;wenn Movie vorhanden
          Debug "Movie free"
          FreeMovie(mID)  ;<= hier IMA, wenn Movie als gültig geladen aber nicht lauffähig
          ; FreeSprite(msID)
        EndIf
        movfile.s = OpenFileRequester("neues Movie laden, Abbrechen mit Cancel", "*.*", "*.*", 0)
        If movfile <> ""
          mID = LoadMovie(#PB_Any, movfile)
          If IsMovie(mID)
            Debug "Movie ok"
            ; xs = MovieWidth(mID)
            ; ys = MovieHeight(mID)
            ; Debug Str(xs) + ":" + Str(ys)
            ; msID = CreateSprite(#PB_Any, xs, ys)  ;Render-Movie-Sprite neue Größe
            ; PlayMovie(mID, #PB_Movie_Rendered)  ;Movie-Rendern auf Sprite starten
            PlayMovie(mID, WindowID(wIDscrn))  ;Movie-Rendern auf Sprite starten
          Else
            Debug "Movie fehler"
          EndIf
        EndIf
      EndIf
    Until Event = 0

    ; If IsMovie(mID)  ;wenn Movie vorhanden
      ; RenderMovieFrame(mID, SpriteID(msID))  ;Movie auf Render-Sprite rendern
      ; UseBuffer(sID2d)
      ; DisplaySprite(msID, 0, 0)  ;Render-Sprite auf neues Sprite
      ; ;das Render-Sprite wird für Alpha-Blending und Zoom auf ein neues Texture-Sprite kopiert
      ; UseBuffer(#PB_Default)
; 
      ; Start3D() 
        ; DisplaySprite3D(sID3d, 0, 0, 255) 
        ; ;hier noch andere Sprite-3D-Funktionen wie darübergelegter Text
      ; Stop3D()
; 
      ; If StartDrawing(ScreenOutput())
        ; DrawText(10, 10, Str(tfps))
        ; StopDrawing()
      ; EndIf
    ; 
      ; tgap.q = (1000 / 30) - (ElapsedMilliseconds() - tfps)
      ; If tgap > 16  ;wenn länger als 16 ms bis nächsten Frame
        ; If tgap > 100
          ; tgap = 100
        ; EndIf
        ; Delay(tgap - 10)  ;Pause einfügen für CPU-Entlastung
      ; EndIf
; 
      ; FlipBuffers(#PB_Screen_SmartSynchronization) 
      ; tfps = ElapsedMilliseconds()  ;aktuelle Zeit holen
    ; EndIf
    
  Until exit
  
End

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 13:51
von dige
Wenn Du auf ein Sprite renderst geht das _nur_ mit DirectX7. Beim DX9 Subsystem
ist seit Anfang ein Bug in RenderMovieFrame() drin, der offenbar nicht so leicht
gefixt werden kann, da es von Fred bisher keine Reaktion gab.

-> http://www.purebasic.fr/english/viewtop ... =4&t=35838

Ansonsten prüfe mal ob Deine Sprite kleiner als die Screensize und quadratisch sind..

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 14:41
von Sven
dige hat geschrieben:Wenn Du auf ein Sprite renderst geht das _nur_ mit DirectX7.
Hab beide probiert. Das Problem gab es schon bei PB3.94...
dige hat geschrieben:Ansonsten prüfe mal ob Deine Sprite kleiner als die Screensize und quadratisch sind..
Im Beispiel nicht, im Original-Code ja. Hab das im Beispiel mit 512x512 Sprites getestet, keine Änderung.

Aber: Vista Codec Pack installiert. Jetzt spielt PlayMovie im Overlay-Modus auch flvs problemlos. Dafür spielt es im Render-Modus überhaupt nix mehr, nicht mal die billigesten AVIs, kommt nur Ton. Anscheinend kann VistaCodec Pack nur ab DirectX9...

Fazit: Leck mich fett, gibt es eben kein Sprite mit Überblenden und Zoomen für Movies, wenn das nicht sauber funktioniert.

Jetzt muss ich nur noch hinbekommen, dass Video im Overlay-Modus nicht immer verschwinden, sobald mal ein Window kurz drüberliegt. Oder in 1 von 10 Starts unsichtbar im Hintergrund laufen. Ich weiss, es gab da mal einen Thread, aber die Suche zeigt ja genialerweise nur noch die Threads seit Umstellung des Forums an...

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 14:57
von dige
ich mach nach jedem playmovie() erstmal nen RedrawWindow_()
und um ganz sicher zu gehen, musste in nem Callback die paint
messages abfangen und dann ebenfalls ein Redraw machen..

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 15:01
von Sven
Ja, irgend sowas war das, werd das mal probieren.

Beruhigend, dass andere Programme damit auch Probleme haben, scheint also eine Windows-eigene Sache zus sein. Ist nur blöd, wenn man sich drauf verlässt. Und da das in einer automatischen Steuerung läuft, kann ich eben nicht einfach sagen: Kein Video zu sehen, nagut starte ichs nochmal...

Re: IsMovie() nicht "bulletproof"?

Verfasst: 11.09.2009 16:33
von Sven
dige hat geschrieben:ich mach nach jedem playmovie() erstmal nen RedrawWindow_()
Was schickst Du dem Window für Messages? Ich hab jetzt nichts gefunden, was immer funktioniert. Und machst Du das PlayMovie auf das Window (also mit WindowID) oder auf den Screen (mit ScreenID)?

Re: IsMovie() nicht "bulletproof"?

Verfasst: 12.09.2009 17:06
von Fluid Byte
Sven hat geschrieben:Was schickst Du dem Window für Messages?
Gar keine. Du verwechselst das mit SendMessage().

Re: IsMovie() nicht "bulletproof"?

Verfasst: 12.09.2009 19:07
von Sven
@Fluid: Wenn Du nix Konstruktives beizutragen hast, halt Dich raus aus'm Funkverkehr, Milz! Die große Klappe von wegen Quellcode, und nix dahinter. Es nervt.
RDW_ERASE Causes the window to receive a WM_ERASEBKGND message when the window is repainted... usw.
Ich setze ein Flag bei WindowRedraw_(), und damit bekommt das Window eine Message, was passiert ist oder passieren soll. Ich hätt halt gern gewusst, welches Flag hier gesetzt werden muss, weil es bei bisher nicht die gewünschte Wirkung hat. Und ich hätts gern von kompetenten Leuten gewusst, die damit schon gearbeitet haben...