视频采集编程

来源:互联网 发布:荧光手写软件下载 编辑:程序博客网 时间:2024/04/30 00:24

在windows中,提供了一整套视频采集函数,要做一个视频采集软件,先要创建一个采集窗口
hCapWnd = capCreateCaptureWindow((LPSTR)"Capture Window",
WS_CHILD | WS_VISIBLE,
        15, 129, VideoW, VideoH,
       m_hWnd, (int) 0) ;

采集窗口的大小一般与摄像头有关,然后指定回调函数,这个函数是用来接收采集的数据的,

FARPROC fpVideoCallback = MakeProcInstance((FARPROC)VideoCallbackProc, m_hInstance);
        capSetCallbackOnVideoStream(hCapWnd, fpVideoCallback);
if(!capDriverConnect(hCapWnd, 0))
MessageBox("Error!  Not found video card!");

设置视频格式。
ZeroMemory(&m_biInput, sizeof(BITMAPINFO));
m_biInput.bmiHeader.biSize = sizeof(BITMAPINFO);
m_biInput.bmiHeader.biWidth = VideoW;
m_biInput.bmiHeader.biHeight = VideoH;
m_biInput.bmiHeader.biPlanes = 1;
m_biInput.bmiHeader.biBitCount = 24;
m_biInput.bmiHeader.biCompression = BI_RGB;
m_biInput.bmiHeader.biSizeImage = VideoW * VideoH * m_biInput.bmiHeader.biBitCount / 8;
m_biInput.bmiHeader.biXPelsPerMeter = 0;
m_biInput.bmiHeader.biYPelsPerMeter = 0;
m_biInput.bmiHeader.biClrUsed = 0;
m_biInput.bmiHeader.biClrImportant = 0;
capSetVideoFormat(hCapWnd, &m_biInput, sizeof(m_biInput));

设置其它一些参数,如帧速率等。
CAPTUREPARMS   CapParam;
capCaptureGetSetup(hCapWnd, &CapParam, sizeof(CapParam));
CapParam.fAbortLeftMouse = FALSE;
CapParam.fAbortRightMouse = FALSE;
CapParam.fYield = TRUE;
CapParam.dwRequestMicroSecPerFrame = 1000000/25;   //25 FPS
capCaptureSetSetup(hCapWnd, &CapParam, sizeof(CapParam));
capOverlay(hCapWnd, TRUE);

开始视频采集
time1 = GetTickCount();
capCaptureSequenceNoFile(hCapWnd);

停止视频采集
capCaptureStop(hCapWnd);

视频采集回调函数

LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
//lpVHdr就是一帧图象的数据
char s[120];
wsprintf(s, "%ld", FrameNo++);
SetDlgItemText(hMainWnd, IDC_CAPFRAME, s);

if(fpCode)
{
memcpy(EncodeSrc, lpVHdr->lpData, lpVHdr->dwBytesUsed);
//MP4压缩
int length = EncEncode(EncodeSrc, EncodeDest);
//写AVI文件
fwrite(&length, sizeof(int), 1, fpCode);
fwrite(EncodeDest, length, 1, fpCode);

time2 = GetTickCount();
WORD dTime = WORD(time2-time1);
fwrite(&dTime, sizeof(WORD), 1, fpCode);
time1 = GetTickCount();
}

    return (LRESULT)TRUE;
}

这是实现视频采集的框架,具体代码大家只有自己写了,因为MP4压缩算法现在美国禁止出口,在Windows中不含有该算法,
采用这种算法每帧图象的数据量只有800字节,如果每秒按15帧来处理,在互联网上传送应该可以实现,如果采用H263协议,数据量还会更小一些,但图象清晰度会下降很多。
而我们现在开发的网上视频系统就是采用这种压缩算法