大家好啊,向大家请教两个问题:
(1)用QQ聊天摄像头录像的代码,想用来当DV来拍摄视频;(2)屏幕录像专家的代码,想把一些演示步骤做成视频资料;请对这块熟悉的朋友帮忙介绍下,谢谢
(1)用QQ聊天摄像头录像的代码,想用来当DV来拍摄视频;(2)屏幕录像专家的代码,想把一些演示步骤做成视频资料;请对这块熟悉的朋友帮忙介绍下,谢谢
解决方案 »
- vs2008 编译 MFC 程序,如何更新编译选项来生成COFF格式的obj呢?
- 一个非常弱智的问题,请教!
- 有谁知道在FlexGrid如何添加鼠标双击响应?
- 为什么程序退出的时候特别慢?
- 急问:怎样在客户区放置图像按钮?
- 讨论:能不能用vc或c实现想计算机一级考试系统的功能
- InstallShield怎么用啊?哪有这方面的资料(在线届帖给分)
- 请投中国的长城和布达拉宫一票。为中国争口气!去http://www.new7wonders.com/voting.php
- 求助:VC中怎样显示保存数据库中的日期时间型变量
- 卸载vs2005求助
- 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;
}