2011-02-10 2 views
14

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

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

+0

Добро пожаловать в StackOverflow. Я рекомендую вам зарегистрироваться для учетной записи, чтобы вы могли отслеживать свои вопросы последовательно. Это отличный вопрос, но вы задаете здесь два вопроса. Можете ли вы задать второй вопрос на новый вопрос? Я думаю, что вы действительно можете найти ответ, который вы хотите здесь: [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), но Я бы без колебаний спросила, не поможет ли это вам. Он должен уметь. – jcolebrand

+1

Я бы посоветовал вам разделить свои вопросы на две части: часть веб-камеры и часть книг. –

+1

@drachenstern: Сомневаюсь, что он найдет ответ на свой вопрос C# в книге о C++. Я полагаю, что это возможно. –

ответ

12

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

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 как параметр.

+0

. Я использую то же самое, что и ур, но я обнаружил, что веб-камера не вызывается всегда. если я перезагружу свою систему, веб-камера вызывается, когда я нажимаю кнопку «Пуск», но если я остановлюсь и снова нажмите «Старт», тогда видео не будет отображаться. значения SendMessage (deviceHandle, WM_CAP_DRIVER_CONNECT, this.index, 0 становятся равными нулю, и видео не отображается. Кто-то предложил мне изменить значение handle/this.index каждый раз, но это тоже не сработало – Swati

+0

я тоже не мог найти, как сохранить это видео, полученное в формате mp4. Пожалуйста, помогите – Swati

+0

Затем я пытаюсь вызвать DeviceManager.GetAllDevices(), он бросает «System.EntryPointNotFoundException:» Не удается найти точку входа «CapGetDriverDescriptionA» в DLL «avicap32.dll». "" Что я делаю неправильно? – EgoPingvina

4

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

Что касается книг, вы обязательно должны посмотреть на Jeffrey Richter's "CLR via C#" и John Skeet's "C# in Depth".

0

Вы можете использовать Microsoft Expression Encoder 4 SP2. Это отличная библиотека, которую вы можете добавить в свой проект и получить просмотр в прямом эфире, моментальные снимки и видеозапись. Более подробно приводится пример проекта Massimo Conti: How to use a web cam in C# with .NET Framework 4.0 and Microsoft Expression Encoder 4

-1

WebCam_Capture.dll для захвата фотографий и видео. Вот Link вот исходный код для этого LINK

Смежные вопросы