Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I capture video from a webcam?

Tags:

c#

.net

I need to capture video from a webcam. Are there any classes in C#/.NET that can help me with this. I am only interested in real time data.

And are there any good C#/.NET books that I can study to gain deep knowledge on the language and the platform?

like image 908
olive Avatar asked Feb 10 '11 04:02

olive


People also ask

How do I use my webcam on my laptop to record?

Open the Start screen by tapping the Windows key and type “Camera” to search for it. Launch the Camera app and use it to record photos and take videos. It work similarly to Windows 10's Camera app, and will save photos to the “Camera Roll” folder in your user account's “Pictures” folder.

How can I record a video from my webcam for free?

Bandicam allows you to record an external video device such as a webcam, Xbox/PlayStation, smartphone, IPTV, etc., in super high quality. You can also put your webcam/facecam on one corner of your video (Picture-in-Picture, Video-in-Video). Try the free version of Bandicam Webcam Recorder!

How do I record video using my webcam windows?

Click on the Windows Start button, scroll down to Camera in the list of apps and click on it. Alternatively, type “Camera” in the Cortana search bar and click on the displayed Camera icon. When the Camera app opens, choose between taking photos or videos. To record a video, click on the video camera icon.


2 Answers

This is what I use. You need a first class to iterate your devices:

public class DeviceManager
{
    [DllImport("avicap32.dll")]
    protected static extern bool capGetDriverDescriptionA(short wDriverIndex,
        [MarshalAs(UnmanagedType.VBByRefStr)]ref String lpszName,
       int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, int cbVer);

    static ArrayList devices = new ArrayList();

    public static TCamDevice[] GetAllDevices()
    {
        String dName = "".PadRight(100);
        String dVersion = "".PadRight(100);

        for (short i = 0; i < 10; i++)
        {
            if (capGetDriverDescriptionA(i, ref dName, 100, ref dVersion, 100))
            {
                TCamDevice d = new TCamDevice(i);
                d.Name = dName.Trim();
                d.Version = dVersion.Trim();

                devices.Add(d);
            }
        }

        return (TCamDevice[])devices.ToArray(typeof(TCamDevice));
    }

    public static TCamDevice GetDevice(int deviceIndex)
    {
        return (TCamDevice)devices[deviceIndex];
    }
}

ANd this one to control the cam.

public class TCamDevice
{
     private const short WM_CAP = 0x400;
    private const int WM_CAP_DRIVER_CONNECT = 0x40a;
    private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
    private const int WM_CAP_EDIT_COPY = 0x41e;
    private const int WM_CAP_SET_PREVIEW = 0x432;
    private const int WM_CAP_SET_OVERLAY = 0x433;
    private const int WM_CAP_SET_PREVIEWRATE = 0x434;
    private const int WM_CAP_SET_SCALE = 0x435;
    private const int WS_CHILD = 0x40000000;
    private const int WS_VISIBLE = 0x10000000;

    [DllImport("avicap32.dll")]
    protected static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName,
        int dwStyle, int x, int y, int nWidth, int nHeight, int hWndParent, int nID);

    [DllImport("user32", EntryPoint = "SendMessageA")]
    protected static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam);

    [DllImport("user32")]
    protected static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);

    [DllImport("user32")]
    protected static extern bool DestroyWindow(int hwnd);

    int index;
    int deviceHandle;

    public TCamDevice(int index)
    {
        this.index = index;
    }

    private string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private string _version;

    public string Version
    {
        get { return _version; }
        set { _version = value; }
    }

    public override string ToString()
    {
        return this.Name;
    }
    /// <summary>
    /// To Initialize the device
    /// </summary>
    /// <param name="windowHeight">Height of the Window</param>
    /// <param name="windowWidth">Width of the Window</param>
    /// <param name="handle">The Control Handle to attach the device</param>
    public void Init(int windowHeight, int windowWidth, int handle)
    {
        string deviceIndex = Convert.ToString(this.index);
        deviceHandle = capCreateCaptureWindowA(ref deviceIndex, WS_VISIBLE | WS_CHILD, 0, 0, windowWidth, windowHeight, handle, 0);

        if (SendMessage(deviceHandle, WM_CAP_DRIVER_CONNECT, this.index, 0) > 0)
        {
            SendMessage(deviceHandle, WM_CAP_SET_SCALE, -1, 0);
            SendMessage(deviceHandle, WM_CAP_SET_PREVIEWRATE, 0x42, 0);
            SendMessage(deviceHandle, WM_CAP_SET_PREVIEW, -1, 0);

            SetWindowPos(deviceHandle, 1, 0, 0, windowWidth, windowHeight, 6);
        }
    }

    /// <summary>
    /// Shows the webcam preview in the control
    /// </summary>
    /// <param name="windowsControl">Control to attach the webcam preview</param>
    public void ShowWindow(global::System.Windows.Forms.Control windowsControl)
    {
        Init(windowsControl.Height, windowsControl.Width, windowsControl.Handle.ToInt32());                        
    }

    /// <summary>
    /// Stop the webcam and destroy the handle
    /// </summary>
    public void Stop()
    {
        SendMessage(deviceHandle, WM_CAP_DRIVER_DISCONNECT, this.index, 0);

        DestroyWindow(deviceHandle);
    }
}

The ShowWindow takes your PictureBox as parameter.

like image 137
Burcephal Avatar answered Sep 21 '22 21:09

Burcephal


I would recommend you to use 3rd party library. It would be the best solution instead of inventing your own bicycle. Here, I used AForge.Net. Though it has some problems concerning performance, but I tweaked the library myself when performance became a critical issue for me. The AForge.Net code is open source and you can tweak it to your needs.

As for books you definitely should look at Jeffrey Richter's "CLR via C#" and John Skeet's "C# in Depth".

like image 25
Dmitrii Lobanov Avatar answered Sep 25 '22 21:09

Dmitrii Lobanov