DShow从WDM驱动程序自动生成的Video Capture Source Filter有一个Pin Property Page,想必各位高手都知道并且见过。这个Pin Property Page里面可以设定帧率、镜头分辨率等设置。
我想问的是,难道不能从程序里设定帧率,和镜头分辨率吗?
当然可以通过程序来设置:用IAMStreamConfig::SetFormat。
首先你获得你想要设置的Pin的IPin指针;然后QueryInterface得到IAMStreamConfig接口,通过这个接口就可以设置了。你可以参考一下AMCap例子,里面有使用IAMStreamConfig接口的演示。
陆老师说得太好了!
完全就那么回事!
给段代码给你参考:
// 设置视频输出Pin的视频大小,并且将设置的值返回
// 如果bMaxSize为TRUE则输出最大支持的视频大小,否则按指定大小输出
HRESULT CCardVideoOpt::SetVideoSize(IBaseFilter* pVideoFilter
, OUT int &iWidth , OUT int &iHeight, IN BOOL bMaxSize)
{
HRESULT hr = NOERROR;
IAMStreamConfig *pAMStreamConfig = NULL;
IPin *pOutPin = NULL;
VIDEOINFOHEADER *pVihTmp;
int iDefaultW,iDefaultH; // 默认的视频宽和高
//AM_MEDIA_TYPE* pMediaType;
pOutPin = CGraphUtility::GetFirstPin(pVideoFilter,PINDIR_OUTPUT);
if(pOutPin == NULL)
{
return E_FAIL;
}
hr = pOutPin->QueryInterface(IID_IAMStreamConfig,(void**)&pAMStreamConfig);
if(FAILED(hr))
{
SAFE_RELEASE(pOutPin);
return hr;
}
int iCount, iSize;
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmt;
hr = pAMStreamConfig->GetNumberOfCapabilities(&iCount, &iSize);
if (sizeof(scc) != iSize)
{
SAFE_RELEASE(pOutPin);
SAFE_RELEASE(pAMStreamConfig);
return E_FAIL;
}
for(int i=0;i<iCount;i++)
{
hr = pAMStreamConfig->GetStreamCaps(i, &pmt, (BYTE*)(&scc));
pVihTmp = (VIDEOINFOHEADER*)(pmt->pbFormat);
if(pmt->subtype == MEDIASUBTYPE_RGB32)
break;
}
iDefaultW = pVihTmp->bmiHeader.biWidth;
iDefaultH = pVihTmp->bmiHeader.biHeight;
if (hr == S_OK)
{
// Find the biggest output size.
if(bMaxSize)
{
iWidth = scc.MaxOutputSize.cx;
iHeight = scc.MaxOutputSize.cy;
}
LONG cbPixel = pVihTmp->bmiHeader.biBitCount/8; // Bytes per pixel in RGB32
// Modify the format block.
VIDEOINFOHEADER *pVih =
(VIDEOINFOHEADER*)(pmt->pbFormat);
pVih->bmiHeader.biWidth = iWidth;
pVih->bmiHeader.biHeight = iHeight;
// Set the sample size and image size.
// (Round the image width up to a DWORD boundary.)
pmt->lSampleSize = pVih->bmiHeader.biSizeImage =
((iWidth + 3) & ~3) * iHeight * cbPixel;
// Now set the format.
hr = pAMStreamConfig->SetFormat(pmt);
if (FAILED(hr))
{
iWidth = iDefaultW;
iHeight = iDefaultH;
pVih->bmiHeader.biWidth = iWidth;
pVih->bmiHeader.biHeight = iHeight;
hr = pAMStreamConfig->SetFormat(pmt);
if (FAILED(hr))
{
SAFE_RELEASE(pOutPin);
SAFE_RELEASE(pAMStreamConfig);
return hr;
}
SAFE_RELEASE(pOutPin);
SAFE_RELEASE(pAMStreamConfig);
return hr;
}
}
SAFE_RELEASE(pOutPin);
SAFE_RELEASE(pAMStreamConfig);
return hr;
}