我使用VFW采集视频用LRESULT CALLBACK capVideoStreamCallback( HWND hWnd, LPVIDEOHDR lpVHdr );
得到了视频缓冲数据,但是该如何从lpVHdr->lpData中取出数据显示在窗口上呢?这个数据是什么格式?如果是bmp格式的,我该怎么构造bmp,最终用StretchBlt显示呢?
得到了视频缓冲数据,但是该如何从lpVHdr->lpData中取出数据显示在窗口上呢?这个数据是什么格式?如果是bmp格式的,我该怎么构造bmp,最终用StretchBlt显示呢?
解决方案 »
- 菜鸟提问:C++实现文件读写速度测试迷茫?
- 我要做一个对局域网内计算机上网记录进行监控的软件,
- CListBOX 如何实现自动滚动
- 怎样在 SLIDER 控件失去焦点时 弹出对话框
- 救命啊,著名的VC问题: fatal error C1001: INTERNAL COMPILER ERROR
- 请问如何实现对话框的拖大拖小呢?
- 是否有将时间进行转换的函数?100的诱惑,回答有分。
- 特殊字符在英文系统下乱码???
- 做控件时,各个的风格不一,需要集中学习吗?还是边学边用?
- 如何读取下载网上的文件,用VC如何实现
- 急:listview如何释放内存?
- dll里的函数传入的是参数FILE *,参入后FILE *任何操作都出错,请问问题出在哪里?
我现在用StretchBlt来写屏,所以是不是应该在capDriverConnect之后,capSetVideoFormat?我的目的是分包这一帧数据,然后发送到网络上,最后再组包显示。
目前我已经取出来了这一帧,可以分包租包。所以我想知道该如何显示这个数据?麻烦你详细指点一下吧!
不论是RGB数据,还是YUV数据,都可以。谢谢!
在网络上传输就一定要编码和解码,不然带宽会受不了。///////////////////////////////////////////////////////////////
HDC hDC = GetDC(m_hWnd);
HDC hMemDC = CreateCompatibleDC(hDC);
// 该位图大小,可以调整到同你采集视频时传递的位图大小一致。
// 这里采用的是默认大小:176*144
HBitmap m_hBitmap = CreateCompatibleBitmap(hDC, 176, 144);RECT rect;
GetClientRect(m_hWnd, &rect);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);
HDRAWDIB hDib = DrawDibOpen();// 参数m_bmpInfo是通过视频采集函数capGetVideoFormat得到的位图格式.
DrawDibDraw(hDib, hMemDC,
0, 0, rect.right, rect.bottom,
&m_bmpInfo.bmiHeader, (LPVOID)lpData,
0, 0, m_bmpInfo.bmiHeader.biWidth, m_bmpInfo.bmiHeader.biHeight,
DDF_NOTKEYFRAME);DrawDibClose(hDib);
BitBlt(hDC, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);SelectObject(hMemDC, hOldBitmap);DeleteDC(hMemDC);ReleaseDC(m_hWnd, hDC);
因为我目前已经用剪贴板共享数据的方法,实现了单帧播放,但是这种方法,无法得知显示的数据Size(我也是初学VC,着了很久,没有找到这个方法),这样无法分包,所以采用回调函数capVideoStreamCallback来取单帧。capGrabFrameNoStop(hWndCap);
capEditCopy(hWndCap);
//***********************
::OpenClipboard(NULL);
hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP);
......
::CloseClipboard();
我改造后的函数:
//*************************************************************
//因为我的视频采集单独用了一个线程,所以用了一个共享缓冲区pVBuffer,
//由FrameCallbackProc来写入,然后发消息给显示窗。
//CopyMemory(pVBufRemote,pVideoHdr->lpData,pVideoHdr->dwBytesUsed);
//::PostMessage(hAVMainWnd, WM_VDSPTOAPPREMOTE, (WPARAM)0, (LPARAM)dwSize);
//Debug中看到共享缓冲区中的数据都传递正常,函数执行正常,为何没反应呢? //pAVCtrl->PlayRemoteVideo();
HDC hDC = ::GetDC(m_hFrameWnd);
HDC hMemDC = CreateCompatibleDC(hDC);
// 该位图大小,可以调整到同你采集视频时传递的位图大小一致。
// 这里采用的是默认大小:176*144
HBITMAP m_hBitmap = ::CreateCompatibleBitmap(hDC, 240, 180);
RECT rect;
::GetClientRect(m_hFrameWnd, &rect);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
HDRAWDIB hDib = DrawDibOpen();
// 参数m_bmpInfo是通过视频采集函数capGetVideoFormat得到的位图格式.
DrawDibDraw(hDib, hMemDC,
0, 0, rect.right, rect.bottom,
&m_BitmapInfo.bmiHeader, (LPVOID)pVBufRemote,
0, 0, m_BitmapInfo.bmiHeader.biWidth, m_BitmapInfo.bmiHeader.biHeight,
DDF_NOTKEYFRAME);
DrawDibClose(hDib);
BitBlt(hDC, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldBitmap);
DeleteDC(hMemDC);
::ReleaseDC(m_hFrameWnd, hDC);
//****************************************************************************
COPY到共享内存后作为参数(LPVOID)pVBufRemote来显示的,一切OK。是不是参数m_bmpInfo的问题?
int StretchDIBits(
HDC hdc, // handle to device context
int XDest, // x-coordinate of upper-left corner of dest. rectangle
int YDest, // y-coordinate of upper-left corner of dest. rectangle
int nDestWidth, // width of destination rectangle
int nDestHeight, // height of destination rectangle
int XSrc, // x-coordinate of upper-left corner of source rectangle
int YSrc, // y-coordinate of upper-left corner of source rectangle
int nSrcWidth, // width of source rectangle
int nSrcHeight, // height of source rectangle
CONST VOID *lpBits, // address of bitmap bits
CONST BITMAPINFO *lpBitsInfo, // address of bitmap data
UINT iUsage, // usage flags
DWORD dwRop // raster operation code
);
非常感谢freeshoot(巴蒂刘) !