I try to record a movie with 25 frames per second, i need write every frame at just moment or openCV do this automatic?
I use this code from cam_writeframe1 file, with a little modifications.
when play recorded movie is very fast, like buster keaton or charles chaplin in old film, quickly..

How can save a movie with real speed?
Thanks for help and greetings!
Code: Select all
IncludeFile "includes/cv_functions.pbi"
Global lpPrevWndFunc
#CV_WINDOW_NAME = "PureBasic Interface to OpenCV"
#CV_DESCRIPTION = "Video is saved to a folder." + Chr(10) + Chr(10) +
"Double-Click the window to open the folder where the video is saved."
ProcedureC WindowCallback(hWnd, Msg, wParam, lParam)
Shared CaptureCV.b, exitCV.b
Select Msg
Case #WM_COMMAND
Select wParam
Case 1
If CaptureCV
SetMenuItemText(0, 1, "Capture")
CaptureCV = #False
Else
SetMenuItemText(0, 1, "Pause")
CaptureCV = #True
EndIf
Case 10
exitCV = #True
EndSelect
Case #WM_DESTROY
exitCV = #True
EndSelect
ProcedureReturn CallWindowProc_(lpPrevWndFunc, hWnd, Msg, wParam, lParam)
EndProcedure
ProcedureC CvMouseCallback(event, x, y, flags, *param.USER_INFO)
Select event
Case #CV_EVENT_RBUTTONDOWN
DisplayPopupMenu(0, *param\uValue)
Case #CV_EVENT_LBUTTONDBLCLK
RunProgram("explorer", "..\Videos", "")
EndSelect
EndProcedure
recfps=25
defWidth=720
defHeight=576
deffps=25
Repeat
nCreate + 1
*capture = cvCreateCameraCapture(0)
Until nCreate = 5 Or *capture
If *capture
cvNamedWindow(#CV_WINDOW_NAME, #CV_WINDOW_AUTOSIZE)
window_handle = cvGetWindowHandle(#CV_WINDOW_NAME)
*window_name = cvGetWindowName(window_handle)
lpPrevWndFunc = SetWindowLongPtr_(window_handle, #GWL_WNDPROC, @WindowCallback())
If CreatePopupImageMenu(0, #PB_Menu_ModernLook)
MenuItem(1, "Pause")
MenuBar()
MenuItem(10, "Exit")
EndIf
hWnd = GetParent_(window_handle)
opencv = LoadImage_(GetModuleHandle_(0), @"icons/opencv.ico", #IMAGE_ICON, 35, 32, #LR_LOADFROMFILE)
SendMessage_(hWnd, #WM_SETICON, 0, opencv)
wStyle = GetWindowLongPtr_(hWnd, #GWL_STYLE)
SetWindowLongPtr_(hWnd, #GWL_STYLE, wStyle & ~(#WS_MAXIMIZEBOX | #WS_MINIMIZEBOX | #WS_SIZEBOX))
cvMoveWindow(#CV_WINDOW_NAME, 20, 20)
ToolTip(window_handle, #CV_DESCRIPTION)
If FileSize("../Videos") <> -2 : CreateDirectory("../Videos") : EndIf
sVideo.s = "../Videos/" + FormatDate("%mm-%dd-%yyyy %hh-%ii-%ss", Date()) + ".avi"
;set resolution and fps
cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH, defWidth)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT, defHeight)
cvSetCaptureProperty(*capture, #CV_CAP_PROP_FPS, deffps)
;Verify resolution and fps
FrameWidth = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_WIDTH)
FrameHeight = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FRAME_HEIGHT)
Framefps = cvGetCaptureProperty(*capture, #CV_CAP_PROP_FPS)
Debug FrameWidth
Debug FrameHeight
Debug Framefps
*writer = cvCreateVideoWriter(sVideo, CV_FOURCC("D", "I", "V", "X"), recfps, FrameWidth, FrameHeight, #True)
If Not *writer : cvCreateVideoWriter(sVideo, CV_FOURCC("M", "S", "V", "C"), recfps, FrameWidth, FrameHeight, #True) : MessageRequester("","MSVC Codec en uso"): EndIf
If *writer
CaptureCV.b = #True
*image.IplImage
*param.USER_INFO = AllocateMemory(SizeOf(USER_INFO))
*param\uValue = window_handle
cvSetMouseCallback(*window_name, @CvMouseCallback(), *param)
Repeat
*image = cvQueryFrame(*capture)
If *image
cvFlip(*image, #Null, 1)
If CaptureCV : cvWriteFrame(*writer, *image) : EndIf
cvShowImage(#CV_WINDOW_NAME, *image)
keyPressed = cvWaitKey(100)
EndIf
Until keyPressed = 27 Or exitCV
FreeMemory(*param)
cvReleaseVideoWriter(@*writer)
EndIf
cvDestroyWindow(#CV_WINDOW_NAME)
cvReleaseCapture(@*capture)
Else
MessageBox_(0, "No hay cámara.", #CV_WINDOW_NAME, #MB_ICONERROR)
EndIf