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