Verfasst: 04.11.2008 10:28
Wenn Du das Video mit PlayMovie abspielst kannst Du die Frames direkt aus dem DirectShow Buffer grabben.
Hier ein Beispiel von Fr34k, das ich für PB4.20 angepasst habe:
Hier ein Beispiel von Fr34k, das ich für PB4.20 angepasst habe:
Code: Alles auswählen
; ---------------------------------------------------------------------
;
; CaptureFrame(#Movie, #Image, #Memory)
;
; Copies the current frame of the #Movie to the #Image.
; The movie must pe paused when calling this, otherwise it will fail.
; The #Image should be the same size as the movie (MovieWidth(), MovieHeight())
; You must provide an unused memory bank number for temporary storage.
;
; ---------------------------------------------------------------------
Structure PB_StructureMovie
Movie.IGraphBuilder
MediaControl.IMediaControl
MediaEvent.IMediaEventEx
Window.IVideoWindow
Audio.IBasicAudio
Video.IBasicVideo
MediaSeeking.IMediaSeeking
state.l ; State of the Movie
EndStructure
Procedure.l CaptureFrame(MovieNumber, ImageNumber)
Protected *Movie.PB_StructureMovie, *Video.IBasicVideo, *Window.IVideoWindow
Protected *ImageData.BITMAPINFOHEADER, DataSize, Parent, Result
*Movie = IsMovie(MovieNumber)
*Movie + MovieNumber * SizeOf(PB_StructureMovie)
*Window = *Movie\Window
*Video = *Movie\Video
Result = 0
If *Video\GetCurrentImage(@DataSize, 0) = #S_OK
*ImageData = AllocateMemory(DataSize)
If *ImageData
If *Video\GetCurrentImage(@DataSize, *ImageData) = #S_OK
If IsImage( ImageNumber )
hBmp = ImageID( ImageNumber )
w = ImageWidth(ImageNumber)
h = ImageHeight(ImageNumber)
bmi.BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = w
bmi\bmiHeader\biHeight = h
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = ImageDepth(ImageNumber)
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
hdc = StartDrawing(ImageOutput(ImageNumber))
If hdc
SetDIBits_( hdc, hBmp, 0, h, *ImageData, @bmi, #DIB_RGB_COLORS)
StopDrawing()
EndIf
EndIf
EndIf
FreeMemory(*ImageData)
EndIf
EndIf
*Window\get_Owner(@Parent)
RedrawWindow_(Parent,0,0,#RDW_INVALIDATE)
ProcedureReturn Result
EndProcedure
; ---------------------------------------------------------------------
; Code example:
; ---------------------------------------------------------------------
#Movie = 0
#Image = 0
#Memory = 0
#Window = 0
#Gadget_Capture = 0
#Gadget_Image = 1
If InitMovie()
FileName$ = OpenFileRequester("Choose Movie","","Movie Files|*.mpg;*.avi;*.mpeg|All Files|*.*", 0)
If LoadMovie(#Movie, FileName$)
Width = MovieWidth()
Height = MovieHeight()
CreateImage(#Image, Width , Height)
If OpenWindow(#Window, 0, 0, Width , Height*2 + 35, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible, "Frame Capture")
If CreateGadgetList(WindowID())
ButtonGadget(#Gadget_Capture, (Width -100)/2, Height+5, 100, 25, "Capture Frame")
ImageGadget(#Gadget_Image, 0, Height+35, Width, Height, UseImage(#Image))
PlayMovie(#Movie, WindowID())
HideWindow(#Window, 0)
Repeat
Event = WindowEvent()
If Event = #PB_EventGadget And EventGadgetID() = #Gadget_Capture
PauseMovie()
CaptureFrame(#Movie, #Image, #Memory)
SetGadgetState(#Gadget_Image, UseImage(#Image))
ResumeMovie()
EndIf
If Event = 0
Delay(1)
EndIf
Until Event = #PB_EventCloseWindow
EndIf
EndIf
EndIf
EndIf