打算做个简单的聊天软件,其中一个我没做过的,就是视频采集。
在网上查了许久资料,终于搞清楚了dshow采集视频的流程
参考资料如下:
https://msdn.microsoft.com/en-us/library/ms787619(v=vs.85).aspx%20
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=31555%20
http://www.360doc.com/content/05/1206/10/2269_40540.shtml%20
http://www.tuicool.com/articles/zaeqUnj%20
现在把代码开源在github上,欢迎大家提出意见:
github:https://github.com/qianqians/video
大家如果需要试用,编译工程然后执行即可
因为是准备做聊天软件,所以是有服务器和客户端的c/s结构。
执行的时候,需要先启动chatserver,然后再执行chat
随意输入一个用户名,点确定即可进入主界面
点击加入视频,即可启动视频流程
因为对dshow不熟悉,所以我在采集之后,没有选择用dshow播放视频,而是解码成了bmp图片,然后调用gdi绘制
CDC * dc = theApp.video->GetDC(); HBITMAP hBitmap = CreateCompatibleBitmap(dc->GetSafeHdc(), width, height); HBITMAP hold = (HBITMAP)dc->SelectObject(hBitmap); BITMAPINFO info; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biWidth = width; info.bmiHeader.biHeight = height; info.bmiHeader.biPlanes = 1; info.bmiHeader.biBitCount = 24; info.bmiHeader.biCompression = BI_RGB; info.bmiHeader.biClrUsed = 0; info.bmiHeader.biSizeImage = 0; info.bmiHeader.biXPelsPerMeter = 0; info.bmiHeader.biYPelsPerMeter = 0; info.bmiHeader.biClrImportant = 0; StretchDIBits(dc->GetSafeHdc(), 0, 0, width, height, 0, 0, width, height, rgbbuf, &info, DIB_RGB_COLORS, SRCCOPY); dc->SelectObject(hold); DeleteObject(hBitmap); theApp.video->ReleaseDC(dc);
,所以CPU占比比较高,不过出乎意料,视频的播放还算很流畅
希望有熟悉dshow的大牛指点dshow的播放部分:)