Frage, AVI aus dem *Memory (Windows) ausgeben

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Frage, AVI aus dem *Memory (Windows) ausgeben

Beitrag 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
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

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

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

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

Beitrag 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

Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

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

Beitrag 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.)
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

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

Beitrag 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
Working on :lol: - LibSGD - MP3D Engine - 8)
Antworten