J'ai ce code, qui n'a pas fait toute ses preuves, mais bon cela pourrait peut être faire avancer le chmilblik...
Code : Tout sélectionner
#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
Procedure AVI2BMP_num_frame( avifile.s, bmpfile.s ,num_frame)
Debug "AVI2BMP_num_frame( avifile.s, bmpfile.s ,num_frame) "
Debug avifile
Debug bmpfile
Debug num_frame
*ptr.BITMAPINFOHEADER
bfh.BITMAPFILEHEADER
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 )
If num_frame=-1
num_frame=numFrames/2
EndIf
pGetFrameObj = CallFunction( #Lib, "AVIStreamGetFrameOpen", pAVIStream, #AVIGETFRAMEF_BESTDISPLAYFMT )
*ptr = CallFunction( #Lib, "AVIStreamGetFrame", pGetFrameObj, num_frame )
Debug *ptr
If *ptr And OpenFile ( 0, bmpfile )
Debug "create fichier"
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
CallFunction( #Lib, "AVIStreamGetFrameClose", pGetFrameObj )
EndIf
CallFunction( #Lib, "AVIFileRelease", pAVIFile )
EndIf
Debug "AVI2BMP : "+ Str(numFrames) + " Frames extracted"
Debug avifile
Debug bmpfile
EndProcedure