用directshow实例amcap截图遇到的问题 amcap这个实例不错,尤其是摄像头各种参数的调整,小弟看着不错,想在上面加个截图程序,响应回车截图.想用ISampleGrabberCB,IVMRWindowlessControl9,都没加上去,望那位大侠详细指点一下,万分感激!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ISampleGrabberCB为什么没加上去?它需要继承类实现指定的虚函数,设置正确的媒体类型,其实使用trans filter来的还快些 请您说的详细一点,小弟刚刚接触directshow,一点不懂,所以不会用,如果您能给出代码也可以,立即给分的![email protected] 我用IBasicVieo里面的GetCurrentImage抓图,普通的摄像头rgb24的可以保存了,可是YUY2的摄像头能得到宽高,大小,就是不能得到size,哪位大侠能指点一下啊!!!!!!!!!!!!!!!!!! 没人解决么?小弟痛哭....发现vidcap32也就是platformsdk这个能抓帧,大家都在说stillcapture,grabbitmap等等的实例,我尝试了又尝试,通宵3天没干出来,我承认很笨,可是高手也吝啬不肯指点么? 看到你说ISampleGrabberCB没加上,说了它是要继承子类,实现部分函数,就可以了,至于要实现哪几个,你看看文档的说明,写的很清楚的,再有ds有它对应的filter,可以直接用 首先响应空格:IMediaControl *pMC = NULL; HRESULT hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC); hr = pMC->Pause(); pMC->Release();然后响应回车:HRESULT hr = gcap.pFg->QueryInterface(IID_IBasicVideo,(LPVOID *)&pBasicVideo); long height, width,bufSize; long* imgData; if(SUCCEEDED(hr)) { //hr = pMC->Pause(); if(FAILED(hr)) { // stop parts that ran //pMC->Stop(); } pBasicVideo->get_VideoHeight(&height); pBasicVideo->get_VideoWidth(&width); /* The second value is NULL to resolve required buffer size. The required buffer size will be returned in variable "bufSize". */ hr = pBasicVideo->GetCurrentImage(&bufSize, 0); if (FAILED(hr)) { ErrMsg("GetCurrentImage failed\n"); return 1; } if (bufSize < 1) { ErrMsg("failed to get data size\n"); return 1; } imgData = new long[bufSize]; // The data will be in DIB format hr = pBasicVideo->GetCurrentImage(&bufSize,(long*)imgData); if(FAILED(hr)) { ErrMsg(TEXT("Error %x: C"), hr); return E_FAIL; } IMediaControl *pMC = NULL; hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC); hr = pMC->Run(); pMC->Release(); } if(FAILED(hr)) { ErrMsg(TEXT("Error %x: Cannot run preview graph"), hr); return FALSE; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // save DIB file as Bitmap. // This sample saves image as bitmap to help // understanding the sample. HANDLE fh; BITMAPFILEHEADER bmphdr; BITMAPINFOHEADER bmpinfo; DWORD nWritten; memset(&bmphdr, 0, sizeof(bmphdr)); memset(&bmpinfo, 0, sizeof(bmpinfo)); bmphdr.bfType = ('M' << 8) | 'B'; bmphdr.bfSize = sizeof(bmphdr) + sizeof(bmpinfo) + bufSize; bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(bmpinfo); bmpinfo.biSize = sizeof(bmpinfo); bmpinfo.biWidth = width; bmpinfo.biHeight = height; bmpinfo.biPlanes = 1; bmpinfo.biBitCount = 24; fh = CreateFile("C:\\result.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL); WriteFile(fh, &bmpinfo, sizeof(bmpinfo), &nWritten, NULL); WriteFile(fh, imgData, bufSize, &nWritten, NULL); CloseHandle(fh);对于普通RGB24的摄像头抓图成功,可是我的摄像头是YUY2的,抓图能得到高宽,大小,就是得不到imgData,汗.... 就是说hr = pBasicVideo->GetCurrentImage(&bufSize,(long*)imgData);这句执行失败了是吧,这里bufSize大小正确吗?返回的hr是多少? 最好自己找个专门处理截图的filter。 就是在解码之后的。不用你搞的这么复杂。现在多媒体处理中有好多这样的filter。 hr = E_FAILbufSize的大小第一次执行已经得到了! Pause之后GetState等待Pause完成再继续。然后就是GetCurrentImage的第一次调用成功了没? hr = E_FAILbufSize的大小第一次执行已经得到了!这是第一次调用GetCurrentImage的返回值还是第二次? Pause之后GetState等待Pause完成再继续。先试试这样,看看第二次能不能返回成功。 确认Pause已经完成,因为Pause响应的回车,我用普通摄像头遇到过这个问题,为了方便我直接响应两个按键,所以Pause确认已经完成! 能够确定是Pause的话。那么你用的是什么Renderer? hr = gcap.pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, gcap.pVCap, NULL, NULL);是这个么?返回值为262782 不是,我是说你的渲染器如果没有使用VMR的话,GetCurrentImage可能会失败。加入一个InPlace的Filter,用来做图像保存的工作,比如Sample Grabber Filter。(当然你前面提到了ISampleGrabberCB,那个东西是ISampleGrabber设置的回调。而你需要先在graph中加入Sample Grabber Filter,才能查询ISampleGrabber接口。)这种方法会更值得信赖一些。 100求解字符串赋值的问题 vc 如何查找并替换WORD文档中的字符串? 如何在写文件的时候,将文件的长度截短 关于藏书架程序的讨论 求解!将Flash作为对话框的“背景”(急) 请问我的VC程序在编译是没有错误,但在运行是老是出现内存异常。 c++调用system命令能屏蔽黑框弹出么 心烦意乱 散分!! LINK : fatal error LNK1104: cannot open file ".\htmlhelp.lib" 返回 SafeArray 出错 CDialog到底在哪抢劫了输入法切换? CEditView 想在程序中调用函数打开一个文件,如111.txt怎么办呢
[email protected]
IMediaControl *pMC = NULL;
HRESULT hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC);
hr = pMC->Pause();
pMC->Release();
然后响应回车:
HRESULT hr = gcap.pFg->QueryInterface(IID_IBasicVideo,(LPVOID *)&pBasicVideo);
long height, width,bufSize;
long* imgData;
if(SUCCEEDED(hr))
{
//hr = pMC->Pause();
if(FAILED(hr))
{
// stop parts that ran
//pMC->Stop();
}
pBasicVideo->get_VideoHeight(&height);
pBasicVideo->get_VideoWidth(&width);
/*
The second value is NULL to resolve required buffer size.
The required buffer size will be returned in variable "bufSize".
*/
hr = pBasicVideo->GetCurrentImage(&bufSize, 0);
if (FAILED(hr))
{
ErrMsg("GetCurrentImage failed\n");
return 1;
}
if (bufSize < 1)
{
ErrMsg("failed to get data size\n");
return 1;
}
imgData = new long[bufSize];
// The data will be in DIB format
hr = pBasicVideo->GetCurrentImage(&bufSize,(long*)imgData);
if(FAILED(hr))
{
ErrMsg(TEXT("Error %x: C"), hr);
return E_FAIL;
}
IMediaControl *pMC = NULL;
hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC);
hr = pMC->Run();
pMC->Release();
}
if(FAILED(hr))
{
ErrMsg(TEXT("Error %x: Cannot run preview graph"), hr);
return FALSE;
}
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
// save DIB file as Bitmap.
// This sample saves image as bitmap to help
// understanding the sample.
HANDLE fh;
BITMAPFILEHEADER bmphdr;
BITMAPINFOHEADER bmpinfo;
DWORD nWritten;
memset(&bmphdr, 0, sizeof(bmphdr));
memset(&bmpinfo, 0, sizeof(bmpinfo));
bmphdr.bfType = ('M' << 8) | 'B';
bmphdr.bfSize = sizeof(bmphdr) + sizeof(bmpinfo) + bufSize;
bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(bmpinfo);
bmpinfo.biSize = sizeof(bmpinfo);
bmpinfo.biWidth = width;
bmpinfo.biHeight = height;
bmpinfo.biPlanes = 1;
bmpinfo.biBitCount = 24;
fh = CreateFile("C:\\result.bmp",
GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);
WriteFile(fh, &bmpinfo, sizeof(bmpinfo), &nWritten, NULL);
WriteFile(fh, imgData, bufSize, &nWritten, NULL);
CloseHandle(fh);
对于普通RGB24的摄像头抓图成功,可是我的摄像头是YUY2的,抓图能得到高宽,大小,就是得不到imgData,汗....
bufSize的大小第一次执行已经得到了!
然后就是GetCurrentImage的第一次调用成功了没?
bufSize的大小第一次执行已经得到了!这是第一次调用GetCurrentImage的返回值还是第二次?
那么你用的是什么Renderer?
&MEDIATYPE_Video, gcap.pVCap, NULL, NULL);
是这个么?返回值为262782