(100分)求QQ聊天摄像头录像及屏幕录像专家代码(在线等) 大家好啊,向大家请教两个问题:(1)用QQ聊天摄像头录像的代码,想用来当DV来拍摄视频;(2)屏幕录像专家的代码,想把一些演示步骤做成视频资料;请对这块熟悉的朋友帮忙介绍下,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单一点的就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); 我的方案,用钩子实现,原理就是捕捉操作的事件,保存,然后回放:// 录像录制函数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;} http://www.cnblogs.com/nemolog/archive/2005/11/03/268353.html 各位仁兄!请问怎样在Combox控件中加入鼠标提示信息功能? 微软的MediaPlayer 7.0中的缓慢拉出的效果是用什么技术实现的?先谢过大家了 如何在DLL的回调函数中杀死一个定时器(在执行一次后)//100分 水晶报表的问题 急问:怎么在一个dll中开启毫秒级的计时器? 铁道部今天不公开,京沪高速铁路----日军中标!(转帖) TAPI编程问题,高手请进阿.急用,在线等待. 请教一下 此头文件“afxext.h”做何用? 8位有符号数组(10个数)求和,谢谢大家,马上给分!! Vc中的色棒 CRichEdit 无法改变文字颜色???!!!
#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);
// 录像录制函数
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;
}