2011-12-21 91 views
0

我有一个我写的小应用程序,只是简单地显示网络摄像头或我的采集卡的预览。目前它的工作原理与我想要的完全相同,只是捕捉卡显示的帧速率比我想要的要低得多。试图从网络摄像头预览视频的性能问题

这是我的相关代码:

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 FPS,这是我的目标帧率(〜每帧34毫秒,),但是当我使用我的应用程序预览它接近10-15 FPS。我也许应该注意到,我的程序将从我的摄像头预览30 FPS。什么可能导致采集卡的问题,我该如何解决?

+0

如果发送'WM_CAP_GET_SEQUENCE_SETUP',http://msdn.microsoft.com/en-us/library/windows/desktop/dd743905(v= VS.85).aspx,捕获窗口并检查'CAPTUREPARAMS'结构,'dwRequestMicroSecPerFrame'是否对应30 fps?默认值是15 fps(66667微秒)。你可以看看“WM_CAP_SET_SEQUENCE_SETUP”。 – 2011-12-21 22:36:48

+0

这真的是一个很好的建议,但从我所知道的看来,这似乎是依赖于驱动程序的,似乎并不适用于我的采集卡。是否有其他可能影响它的参数或设置? – 2011-12-22 04:24:17

回答