Как я могу захватить видео с веб-камеры? - PullRequest
16 голосов
/ 10 февраля 2011

Мне нужно захватить видео с веб-камеры. Существуют ли классы в C # /. NET, которые могут помочь мне в этом. Меня интересуют только данные в реальном времени.

А есть ли хорошие книги по C # / .NET, которые я могу изучать, чтобы получить глубокие знания по языку и платформе?

Ответы [ 4 ]

13 голосов
/ 10 февраля 2011

Это то, что я использую. Вам нужен первый класс для итерации ваших устройств:

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];
    }
}

И этот для управления камерой.

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);
    }
}

ShowWindow принимает ваш PictureBox в качестве параметра.

4 голосов
/ 10 февраля 2011

Я бы порекомендовал вам использовать стороннюю библиотеку. Это было бы лучшим решением, а не изобретать свой собственный велосипед. Здесь я использовал AForge.Net . Хотя у нее есть некоторые проблемы с производительностью, но я сам подправил библиотеку, когда производительность стала для меня критической проблемой. Код AForge.Net имеет открытый исходный код, и вы можете настроить его под свои нужды.

Что касается книг, вам определенно стоит взглянуть на "CLR via C #" Джеффри Рихтера * и "C # in Depth" Джона Скита .

0 голосов
/ 15 декабря 2015

Используйте WebCam_Capture.dll для захвата фотографий и видео. Вот Ссылка Вот исходный код для этого ССЫЛКА

0 голосов
/ 15 апреля 2015

Вы можете использовать Microsoft Expression Encoder 4 SP2 .Это отличная библиотека, которую вы можете добавить в свой проект и получить предварительный просмотр в реальном времени, снимки и видеозапись .Более подробная информация включена в пример проекта Массимо Конти: Как использовать веб-камеру в C # с .NET Framework 4.0 и Microsoft Expression Encoder 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...