大家好啊,向大家请教两个问题:
(1)用QQ聊天摄像头录像的代码,想用来当DV来拍摄视频;(2)屏幕录像专家的代码,想把一些演示步骤做成视频资料;请对这块熟悉的朋友帮忙介绍下,谢谢

解决方案 »

  1.   

    简单一点的就vfw,难一点的就DS。贴一个vfw的代码(我做摄像头测试的时候就是参照下面的代码写的):
    #include <windows.h>
    #include <stdio.h>
    #include <vfw.h>
    #pragma comment(lib,"vfw32.lib")HWND ghWndCap ; //捕获窗的句柄
    CAPDRIVERCAPS gCapDriverCaps ; //视频驱动器的能力
    CAPSTATUS gCapStatus ; //捕获窗的状态
    char szCaptureFile[] = "MYCAP.AVI";
    char gachBuffer[20];LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)
    {
    if(!ghWndCap)return FALSE;//获得捕获窗的状态
    capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS));//更新捕获窗的大小
    SetWindowPos(ghWndCap,NULL,0,0,gCapStatus.uiImageWidth,gCapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
    if(nID==0){//清除旧的状态信息
    SetWindowText(ghWndCap,(LPSTR)"hello");
    return (LRESULT)TRUE;
    }//显示状态ID和状态文本
    wsprintf(gachBuffer,"Status# %d: %s",nID,lpStatusText);
    SetWindowText(ghWndCap,(LPSTR)gachBuffer);
    return (LRESULT)TRUE;
    }
    LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
    {
    if(!ghWndCap)return FALSE;
        if(nErrID==0)return TRUE;//清除旧的错误
    wsprintf(gachBuffer,"Error# %d",nErrID);//显示错误标识和文本
    MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION); 
    return (LRESULT) TRUE;
    } LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)
    {
    FILE *fp;
    fp=fopen("caram.dat","w");
    if(!ghWndCap)return FALSE;//假设fp为一打开的.dat文件指针
    fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp);
    return (LRESULT)TRUE;

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
    {
    static TCHAR szAppName[]=TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc=WndProc;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName=szAppName;
    if(!RegisterClass(&wndclass))
    {
    MessageBox(NULL,TEXT("This program requires WindowsNT!"),szAppName,MB_ICONERROR);
    return 0;
    }
    hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch(message)
    {
    case WM_CREATE:
    {
    ghWndCap=capCreateCaptureWindow((LPSTR)"Capture  Window",WS_CHILD|WS_VISIBLE,0,0,300,240,(HWND)hwnd,(int)0); 
    capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc); 
    capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc);
    capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);
    capDriverConnect(ghWndCap,0); // 将捕获窗同驱动器连接 
    //获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中
    capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS));
    capPreviewRate(ghWndCap, 66); // 设置Preview模式的显示速率
    capPreview(ghWndCap, TRUE); //启动Preview模式
    if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力
    capOverlay(ghWndCap,TRUE); //启动Overlay模式
    if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap); //Video source 对话框
    if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap); // Video format 对话框
    if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap); // Video display 对话框
    capFileSetCaptureFile( ghWndCap, szCaptureFile); //指定捕获文件名
    capFileAlloc(ghWndCap, (1024L * 1024L * 5)); //为捕获文件分配存储空间
    capCaptureSequence(ghWndCap); //开始捕获视频序列
    capGrabFrame(ghWndCap); //捕获单帧图像}return 0;
    case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);
    GetClientRect(hwnd,&rect);
    DrawText(hdc,TEXT("Hello,Windows98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    EndPaint(hwnd,&ps);
    return 0;
    case WM_DESTROY:
    {
    capSetCallbackOnStatus(ghWndCap,NULL);
    capSetCallbackOnError(ghWndCap,NULL); 
    capSetCallbackOnFrame(ghWndCap,NULL);
    capCaptureAbort(ghWndCap);//停止捕获
    capDriverDisconnect(ghWndCap); //将捕获窗同驱动器断开
    PostQuitMessage(0);
    }
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
      

  2.   

    我的方案,用钩子实现,原理就是捕捉操作的事件,保存,然后回放:
    // 录像录制函数
    LRESULT CXXApp::RecordProc_(int code, WPARAM wParam, LPARAM lParam)
    {
    if (code < 0) 
    {
    return CallNextHookEx(theApp.m_hHook, code, wParam, lParam);
    } switch(code) 
    {
    case HC_SYSMODALON:
    _bSysModaling = TRUE;
    break;
    case HC_SYSMODALOFF:
    _bSysModaling = FALSE;
    break;
    case HC_ACTION:
    if (!_bSysModaling) 
    {
    PEVENTMSG pMsg = new EVENTMSG;
    *pMsg = *(PEVENTMSG)lParam; theApp.GetEventArray()->Add(pMsg);
    }
    break;
    }
    return 0;
    }// 录像回放函数
    LRESULT CXXApp::PlaybackProc_(int code, WPARAM wParam, LPARAM lParam)
    {
    if (code < 0) 
    {
    return CallNextHookEx(theApp.m_hHook, code, wParam, lParam);
    } int nRet = 0;
    switch(code) 
    {
    case HC_SYSMODALON:
    _bSysModaling = TRUE;
    break;
    case HC_SYSMODALOFF:
    _bSysModaling = FALSE;
    break;
    case HC_GETNEXT:
    if (!_bSysModaling) 
    {
    int nArraySize = theApp.GetEventArray()->GetSize();
    if (_nPlayIndex >= nArraySize) 
    {
    theApp.OnStop();      // 播放完毕,停止
    }
    else
    {
    PEVENTMSG pMsg = theApp.GetEventArray()->GetAt(_nPlayIndex);
    *((PEVENTMSG)lParam) = *pMsg; if (_bPlayWait && _nPlayIndex > 0) 
    {
    PEVENTMSG pPrevMsg = theApp.GetEventArray()->GetAt(_nPlayIndex - 1);
    nRet = pMsg->time - pPrevMsg->time;
    _bPlayWait = FALSE;
    }
    }
    }
    break;
    case HC_SKIP:
    if (!_bSysModaling) 
    {
    _nPlayIndex++;
    _bPlayWait = TRUE;
    }
    break;
    } return nRet;
    }使用方法:
    void CXXApp::OnRecord() 
    {
        //...
        m_hHook = ::SetWindowsHookEx(WH_JOURNALRECORD,JournalRecordProc_,m_hInstance,0);
    }void CXXApp::OnStop() 
    {
       ::UnhookWindowsHookEx(m_hHook);
       //...
       m_hHook = NULL;
    }
      

  3.   

    http://www.cnblogs.com/nemolog/archive/2005/11/03/268353.html