19,469
社区成员
发帖
与我相关
我的任务
分享
IGraphBuilder *m_pGB;//filter最大容器
IAMStreamConfig *m_pSC; //设备
ICaptureGraphBuilder2* m_pCapture;
IBaseFilter* m_pBF;
IMediaControl* m_pMC;//采集媒体使用接口
IVideoWindow* m_pVW;//采集视屏使用接口
CComPtr <ISampleGrabber> m_pGrabber;
HRESULT hr;
hr = InitCaptureGraphBuilder(iDeviceID);
if (FAILED(hr))
{
AfxMessageBox("Failed to get video interfaces!");
return hr;
}
// create a sample grabber
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabber )
{
AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not registered?");
return hr;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
//设置视频格式
//分辨率
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
m_pSC->GetNumberOfCapabilities(&count, &size);
CString strMsg;
AM_MEDIA_TYPE* mtPtr;
VIDEOINFOHEADER *vihPtr = NULL;
for (int i = 0; i < pixelTypeSize; i ++)
{
m_pSC->GetStreamCaps(j, &mtPtr, reinterpret_cast<BYTE*>(&pSCC));
long cbPixel = 2;
VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(mtPtr->pbFormat);
pVih->bmiHeader.biWidth = width;
pVih->bmiHeader.biHeight = height;
//我这边省略了一些东西,排序了一下,反正得到的width和height是支持里面得到的
mtPtr->lSampleSize = pVih->bmiHeader.biSizeImage = ((width+3)&~3)*height*cbPixel;
hr = m_pSC->SetFormat(mtPtr);
if(FAILED(hr))
continue;
hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ))
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
//hr = m_pGrabber->SetMediaType(mtPtr);
if( SUCCEEDED(hr))
{
break;
}
}
if(FAILED(hr))
return hr;
hr = m_pGrabber->GetConnectedMediaType(&mt);
if (FAILED(hr))
return hr;
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
////***关键就是这里通过GetConnectedMediaType得到的Width和height永远是445....
所以后面就是445了,之前设置的都没有起效果。。。