Seite 1 von 1

Frage, AVI aus dem *Memory (Windows) ausgeben

Verfasst: 17.08.2012 15:08
von mpz
Hallo,

ich benutze die "avifil32.dll" dll-Datei um AVI Dateien wiederzugeben. Leider finde ich keine Möglichkeit um eine AVI Datei aus dem Arbeitsspeicher (Windows) wiederzugeben. Kennt jemand eine Möglichkeit dazu?

Gruß Michael

Re: Frage, AVI aus dem *Memory (Windows) ausgeben

Verfasst: 20.08.2012 07:58
von dige
Geht es dabei um Deine neue Erweiterung Videos auf Sprites? Wenn ja, bitte nicht in die
avifil32 API investieren, damit kann man nur VfW komplatible Videos abspielen. Besser
gleich auf DirectShow wechseln...

Re: Frage, AVI aus dem *Memory (Windows) ausgeben

Verfasst: 20.08.2012 14:08
von mpz
Hallo dige,

avifil32 ist sehr schnell bzw. läßt sich super einbinden. Ich habe das Gleiche mit der in PB eingebauten Movie Funktion probiert und bekomme nur 1/10 so viele Frames (hier mal der lahme testsource).

Gibt es denn mit DirectShow die Möglichkeit ein Movie aus dem Ram wiederzugeben?

Gruß Michael

Code: Alles auswählen

Structure PB_StructureMovie
  Movie.IGraphBuilder
  MediaControl.IMediaControl
  MediaEvent.IMediaEventEx
  Window.IVideoWindow
  Audio.IBasicAudio
  Video.IBasicVideo
  MediaSeeking.IMediaSeeking
  state.l
EndStructure

Procedure MP_MovieToTexture(MovieNumber, Texture)
  Protected *Movie.PB_StructureMovie, *Video.IBasicVideo, *Window.IVideoWindow
  Protected *ImageData.BITMAPINFOHEADER, DataSize, Parent, Result
  Protected hBmp, w, h, hdc
  Protected bmi.BITMAPINFO

  *Movie  = IsMovie(MovieNumber)
  *Window = *Movie\Window
  *Video  = *Movie\Video
  
  alpha = 1
  If alpha = 1
      alpha = #D3DFMT_A8R8G8B8
  Else
     alpha = #D3DFMT_R8G8B8
  EndIf
  MipLevels = 1
  If MipLevels < 0  Or MipLevels > 10 
     MipLevels = #D3DX_FROM_FILE
  EndIf
   
  ForEach TextureM() ; <- MP3D spezifisch, bzw texturstrukture...
    If TextureM() = Texture  


  If *Video\GetCurrentImage(@DataSize, 0) = #S_OK

    *ImageData = AllocateMemory(DataSize)
    If *ImageData

;      ProcedureReturn
      
      If *Video\GetCurrentImage(@DataSize, *ImageData) = #S_OK
        
      Width = MovieWidth(MovieNumber)
      Height = MovieHeight(MovieNumber)
      
      
  If  D3DXCreateTextureFromFileInMemoryEx (*D3DDevice, *ImageData, DataSize,  Width, Height, MipLevels, 0, alpha , #D3DPOOL_MANAGED, #D3DX_FILTER_TRIANGLE, #D3DX_DEFAULT, 0, 0, 0,  @*D3DTexture.IDirect3DTexture9)= #D3D_OK
    
      TextureM()\D3DTexture\Release()
      TextureM()\D3DTexture = *D3DTexture
      
      TextureM()\D3DTexture\GetLevelDesc(0,pDesc.D3DSURFACE_DESC) 
      TextureM()\Format = pDesc\format
      TextureM()\width  = pDesc\Width
      TextureM()\height = pDesc\Height
  
      FreeMemory(*ImageData)
      ProcedureReturn TextureM()
  Else
      ;FreeMemory(*bitmap)
      error = 18
      DeleteElement(TextureM())    
      ProcedureReturn #False
  EndIf

      EndIf

      FreeMemory(*ImageData)
    EndIf

  EndIf
    EndIf
  Next

EndProcedure

#Movie = 0

MP_Graphics3D (640,480,0,3) ; Erstelle ein WindowsFenster mit 3D Funktion #Window = 0
SetWindowTitle(0, "3D Darstellung eine Würfels") ; Setzt einen Fensternamen

;Width = 100
;Height = 100



camera=MP_CreateCamera() ; Kamera erstellen

light=MP_CreateLight(1) ; Es werde Licht

Mesh=MP_CreateCube() ; Und jetzt eine Würfel

MP_PositionEntity (Mesh,0,0,3) ; Position des Würfels


If InitMovie()
  FileName$ = OpenFileRequester("Choose Movie","","Movie Files|*.mpg;*.avi;*.mpeg|All Files|*.*", 0)
 
  If LoadMovie(#Movie, FileName$)
    
    
    Width = MovieWidth(MovieNumber)
    Height = MovieHeight(MovieNumber)
    
    Texture = MP_CreateTexture(Width,Height)
        
    MP_MovieToTexture(#Movie,Texture)
    MP_EntitySetTexture (Mesh, Texture)
    
  EndIf
  
EndIf  


Max = MovieLength(#Movie)

Debug max


Frame = 300
While Not MP_KeyDown(#PB_Key_Escape) And Not WindowEvent() = #PB_Event_CloseWindow; Esc abfrage oder Windows Schliessen
  
    Frame + 1
    If Frame > Max : Frame = -1 : EndIf
    
    MovieSeek(#Movie, Frame)

    MP_MovieToTexture(#Movie,Texture)
    
    MP_DrawText (10,10,"FPS: "+Str(MP_FPS ()))
    
    MP_TurnEntity (Mesh,0.1,0.1,0.1) ; dreh den Würfel
    MP_RenderWorld() ; Erstelle die Welt
    MP_Flip () ; Stelle Sie dar
    
Wend


Re: Frage, AVI aus dem *Memory (Windows) ausgeben

Verfasst: 20.08.2012 14:18
von dige
Ich meinte eher das hier: http://www.purebasic.fr/german/viewtopi ... 73#p269873
(DshowMedia.pbi v1.3 tested with Purebasic v4.51, 2010 by Inc.)

Re: Frage, AVI aus dem *Memory (Windows) ausgeben

Verfasst: 20.08.2012 17:13
von mpz
Hi,

danke für den Tipp, aber bei directshow erhalte ich 16 FPS und bei AVIFIL32 schlappe 66 FPS. Da hilft auch nicht die tolle Kompatibiliät, bzw ist dann nicht einsetzbar...

Das Problem ist das das BIld auszulesen bei directshow zu lange Zeit kostet. Das in die DX9 Datei reinzuschieben ist vernachlässigbar...

:(
Gruß Michael