读书人

VFW视频开发,该怎么解决

发布时间: 2014-01-17 15:01:00 作者: rapoo

VFW视频开发
想做个实时视频开发,用VFW做,遇到了点困难,有哪位大侠会的交流下啊。

问题如:

如何获得图像的文件头?

[解决办法]
其实我也不懂,总觉得回调函数啊自己派生的类什么的很麻烦,如果涉及线程什么的有些会不支持吧,于是回调就会出问题,帮你搜了下,涉及回调函数的
原地址
http://www.10moons.com/bbs/dispbbs.asp?boardid=19&replyid=81376&id=31190&page=41&skin=0&Star=2
sdk3000回调函数采集的图像yuy2如何转换为rgb24
/原始流回调函数. 使用CaptureFileAsBmp使用完成yuv2-rgb,可选择存储文件
void CALLBACK PrcCapSourceStreamCallBack( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount )
{
TRACE("CallBack\n");
DT("CallBack");
if(!g_bSnap)
return;
g_bSnap = FALSE;

BYTE *pRGB24Buffer = new BYTE[lnWidth*lnHeight*3];
BYTE *pYUVBuffer = new BYTE[lnWidth*lnHeight*lnBiCount];

//要进行倒置
for(int i = 0; i < lnHeight; i++)
{
memcpy(pYUVBuffer + i * lnWidth * lnBiCount,
(BYTE*)pBuf + (lnHeight - i - 1) * lnWidth * lnBiCount,lnWidth * lnBiCount);
}

//该函数在传文件名为空时仅仅将YUY2数据转为RGB24数据在pRGB24Buffer中输出。
CaptureFileAsBmp("c:\\aa.bmp",pYUVBuffer,pRGB24Buffer,lnWidth,lnHeight);

delete []pYUVBuffer;
delete []pRGB24Buffer;

将回调到的RGB数据写一个BMP的文件头存储为BMP
void CALLBACK VCPrcPicMessage( long lnCardID, long pBuf, long lnWidth, long lnHeight)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
BITMAPINFOHEADER * pHeader; // bitmap info-header
DWORD dwTmp;

pHeader = (BITMAPINFOHEADER *) pBuf;
pHeader->biSize = sizeof(BITMAPINFOHEADER);
pHeader->biBitCount = 24;
pHeader->biWidth = lnWidth;
pHeader->biHeight = lnHeight;
pHeader->biPlanes = 1;
pHeader->biCompression = BI_RGB;
pHeader->biSizeImage = lnWidth * lnWidth * 3;
pHeader->biXPelsPerMeter = 0;
pHeader->biYPelsPerMeter = 0;
pHeader->biClrUsed = 0;
pHeader->biClrImportant = 0;

// Create the .BMP file.
hf = CreateFile("c:\\1.bmp",
GENERIC_READ
[解决办法]
GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,


(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
return;
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pHeader->biSize + pHeader->biClrUsed
* sizeof(RGBQUAD) + pHeader->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pHeader->biSize + pHeader->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
return;
}

/*
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pHeader, sizeof(BITMAPINFOHEADER)
+ pHeader->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, NULL))
return;
*/
// Copy the array of color indices into the .BMP file.
if(!WriteFile(hf, (void*)pBuf, pHeader->biSizeImage, (LPDWORD) &dwTmp,NULL))
return;

// Close the .BMP file.
if (!CloseHandle(hf))
return;


}


读书人网 >C++

热点推荐