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

本文介绍如何使用IAMStreamConfig接口调整DirectShow中VideoCaptureSourceFilter的视频帧率和分辨率。通过示例代码展示了如何获取输出Pin,设置视频大小并进行格式配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值