Проблемы с производительностью при попытке просмотра видео с веб-камеры - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть небольшое приложение, которое я написал, которое просто отображает предварительный просмотр веб-камеры или мою карту захвата. На данный момент он работает именно так, как я хочу, за исключением того, что карта захвата отображается с гораздо меньшей частотой, чем мне бы хотелось.

Вот мой соответствующий код:

    private const int WM_CAP_DRIVER_CONNECT = 1034;
    private const int WM_CAP_SET_PREVIEW = 1074;
    private const int WM_CAP_SET_PREVIEWRATE = 1076;
    private const int WM_CAP_SET_SCALE = 1077;
    private const int WS_CHILD = 1073741824;
    private const int WS_VISIBLE = 268435456;
    private const short SWP_NOMOVE = 2;
    private const short SWP_NOZORDER = 4;
    private const short HWND_BOTTOM = 1;
    private const int iDevice = 0;
    private int hHwnd;
    private int previewRate = 34;
    private int width = 640;
    private int height = 480;

    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

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

    [DllImport("user32.dll")]
    static extern bool DestroyWindow(int hndw);

    [DllImport("avicap32.dll")]
    public static extern int capCreateCaptureWindow(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

    private void OpenPreviewWindow() 
    {
        hHwnd = capCreateCaptureWindow(iDevice.ToString(), (WS_VISIBLE | WS_CHILD), 0, 0, width, height, Handle.ToInt32(), 0);

        //  Connect to device
        if (SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) != -1) 
        {
            SendMessage(hHwnd, WM_CAP_SET_SCALE, 1, 0);
            SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, previewRate, 0);
            SendMessage(hHwnd, WM_CAP_SET_PREVIEW, 1, 0);
            SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, width, height, (SWP_NOMOVE | SWP_NOZORDER));
        }
        else 
        {
            DestroyWindow(hHwnd);
        }
    }

При предварительном просмотре карты захвата в приложении, таком как FMLE, она просматривается со скоростью 30 кадров в секунду, что является моей целевой частотой кадров (~ 34 миллисекунды на кадр), однако, когда я использую свое приложение для предварительного просмотра, оно ближе к 10-15 кадрам в секунду. Я должен также отметить, что моя программа будет просматривать 30 кадров в секунду с моей веб-камеры. Что может быть причиной проблемы с картой захвата, и как я могу это исправить?

1 Ответ

0 голосов
/ 22 декабря 2011

Используйте DirectShow для просмотра веб-камеры.

Примером может быть: http://www.codeproject.com/KB/audio-video/WebcamUsingDirectShowNET.aspx

или http://www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

...