Download Source.zip - 2.09 MB Download WebCamScheduler.zip - 2.01 MB
Introduction
This application is about using a webCam to captue video to a file (.avi).
it also has an ability to schedule recording times to start the video capturing automatically.
We can use any WebCam and set all kind of properties to use with the WebCam like video size and source and the WebCam settings itself.
Background
The base for this code is using the avicap32 dll.
With this dll you can connect to the webCam and set it's settings.
We use SendMessage to send messages to the WebCam like Connect and capture video.
There are afew articles about this issue but I will try to make this a very simple one.
Using the code
The first thing we need to do is to set our capturing control, I am using a simple PictureBox Control to host the output of the WebCam.
This is done with only one line of code:
mCapHwnd = capCreateCaptureWindowA("WebCap", WS_VISIBLE | WS_CHILD, 0, 0,
this.pictureBox1.Width, this.pictureBox1.Height, this.pictureBox1.Handle.ToInt32(), 0);
The next thing we need to do is to connect to our WebCam:
SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
Next we need some lines of code to set the webcam settings:
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 1, 0);
SendMessage(mCapHwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0);
For capturing video you must set all kind of video properties like if you want to capture audio etc.
We need to use the CAPTUREPARMS
struct for that, you can find it's declration inside the source code download.
The next line is using the CAPTUREPARMS
struct to set the WebCam setting we want:
SendMessage2(mCapHwnd, WM_CAP_SET_SEQUENCE_SETUP,
new IntPtr(Marshal.SizeOf(CaptureParams)),ref CaptureParams);
One importent param in the CAPTUREPARMS struct is fYield
, set this to true (1) if you want to capture the video in adifferent tread then your form.
The next thing we want to do is to capture the video in to the PictureBox control. we do this by calling this message:
SendMessage(mCapHwnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0);
We need to call this line inside a timer tick event so we get a continues video
I have used a System.Threading.Timer
to do this.
private void DoIt()
{
System.Threading.Timer t = null;
t = new System.Threading.Timer(delegate(object state)
{
t.Dispose();
CaptureImage();
DoIt();
}, null, 66, -1);
}
The next thing we need to do is to capture the video to a file (.avi file is the default file using the avicap32.dll)
string file = DateTime.Now.ToShortDateString().Replace('/','_') +
"_" + DateTime.Now.ToLongTimeString().Replace(':','_') + ".avi";
SendMessageA(mCapHwnd, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, dir +
Path.DirectorySeparatorChar + file);
SendMessage(mCapHwnd, WM_CAP_SEQUENCE, 0, 0);
The next two methods are used to config the WebCam Source and Format.
Use this only if you dont want to use the defaults of your WebCam.
private void btnConfig_Click(object sender, EventArgs e)
{
SendMessage(mCapHwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
}
private void btnFormat_Click(object sender, EventArgs e)
{
SendMessage(mCapHwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0);
}
The scheduling part of the code is very simple.
I am using the app.config file to store the time I want to start capturing and use a Timer
control to check if it is time to start capturing.
You can check this out in the source code download.
Ok, the only thing left to do it to disconnect from the WebCam when the work is done:
SendMessage(mCapHwnd, WM_CAP_DISCONNECT, 0, 0);
That's it.
Hope I succeeded in keeping it simple.
Points of Interest
This is my first application using a WebCam.
You can do the same with directX but I found this method to be the fast and simple.
History
Keep a running update of any changes or improvements you've made here.