Code: Select all
; Converts a avi videostream file into single bitmap images
; dige 09/2003
#streamtypeVIDEO = $73646976
#AVIGETFRAMEF_BESTDISPLAYFMT = 1
#AVI_ERR_OK = 0
#Lib = 0
Procedure AVI2BMP ( avifile.s, bmpfile.s )
*ptr.BITMAPINFOHEADER
bfh.BITMAPFILEHEADER
bmpdir.s = GetPathPart( bmpfile )
bmpfile = GetFilePart( bmpfile )
res = CallFunction( #Lib, "AVIFileOpen", @pAVIFile, @avifile.s, #OF_SHARE_DENY_WRITE, 0 )
If res = #AVI_ERR_OK
res = CallFunction( #Lib, "AVIFileGetStream", pAVIFile, @pAVIStream, #streamtypeVIDEO, 0 )
If res = #AVI_ERR_OK
firstFrame = CallFunction( #Lib, "AVIStreamStart", pAVIStream )
numFrames = CallFunction( #Lib, "AVIStreamLength", pAVIStream )
pGetFrameObj = CallFunction( #Lib, "AVIStreamGetFrameOpen", pAVIStream, #AVIGETFRAMEF_BESTDISPLAYFMT )
For a = firstFrame To ( numFrames - 1 ) - firstFrame
*ptr = CallFunction( #Lib, "AVIStreamGetFrame", pGetFrameObj, a )
If *ptr And OpenFile ( 0, bmpdir + Right("000" + Str(a), 4 ) + "_" + bmpfile )
bfh\bfType = $4d42
bfh\bfSize = SizeOf(BITMAPFILEHEADER) + *ptr\biSize + *ptr\biSizeImage
bfh\bfReserved1 = 0
bfh\bfReserved2 = 0
bfh\bfOffBits = SizeOf(BITMAPFILEHEADER) + *ptr\biSize
WriteData(0,@bfh, SizeOf(BITMAPFILEHEADER) )
WriteData( 0,*ptr, SizeOf(BITMAPINFOHEADER) )
WriteData(0, *ptr+SizeOf(BITMAPINFOHEADER), *ptr\biSizeImage)
CloseFile (0)
EndIf
Next
CallFunction( #Lib, "AVIStreamGetFrameClose", pGetFrameObj )
EndIf
CallFunction( #Lib, "AVIFileRelease", pAVIFile )
EndIf
MessageRequester( "AVI2BMP", Str(numFrames) + " Frames extracted", 0 )
EndProcedure
OpenLibrary ( #Lib , "AVIFIL32.DLL")
CallFunction ( #Lib, "AVIFileInit" )
avifile.s = OpenFileRequester ( "Select AVI File", "", "Video|*.avi", 0 )
bmpfile.s = SaveFileRequester ( "BMP Savepath", GetPathPart( avifile.s )+"Avi2bmp.bmp", "Bild|*bmp", 0 )
If avifile And bmpfile : AVI2BMP( avifile, bmpfile ) : EndIf
CallFunction( #Lib, "AVIFileExit" )
CloseLibrary( #Lib )