在程序中设置 Video Capture Source 的 Pin 属性

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;iGetStreamCaps(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; }

你可能感兴趣的:(c++)