wince环境读取directshow相关属性

本文介绍如何使用飞凌OK210-A开发板上的Wince6.0系统和OV3640摄像头,通过IAMVideoProcAmp和IAMStreamConfig接口获取摄像头的亮度、分辨率和帧频等关键属性。

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

开发环境:飞凌ok210-a板、wince6.0系统、OV3640 210用摄像头。

源程序:飞凌自带的Camera_App测试程序,网上很容易下载到。

涉及接口IAMVideoProcAmp 、IAMStreamConfig,IAMCameraControl调用方法与IAMVideoProcAmp相似,因此省略。

参考文章:http://blog.youkuaiyun.com/zwgdft/article/details/7279599

下面的代码是获取亮度、分辨率、帧频等属性:

void CCamera::GetVideoProc()
{
	CComPtr<IAMVideoProcAmp> pVideoProc;
	m_pVideoCaptureFilter->QueryInterface(&pVideoProc);
	LONG lBright=0,lFlag=0;
	CString csBright=L"";    
	HRESULT hr;
	hr=pVideoProc->Get(VideoProcAmp_Brightness, &lBright, &lFlag);
	if(hr==S_OK)
	{
		csBright.Format(L"%d",lBright);
		AfxMessageBox((LPCTSTR)csBright,0,0);
	}
	else
	{
		AfxMessageBox(_T("get hr fail"),0,0);
	}
	if (pVideoProc != NULL)
	{
		pVideoProc.Release();
		pVideoProc = NULL;
	}
}


void CCamera::GetStreamConfig()
{
	CComPtr<IAMStreamConfig> pConfig;
	CString szOutput;
	try
	{
		//找到IAMStreamConfig接口
		m_pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_STILL, &MEDIATYPE_Video,
			m_pVideoCaptureFilter,IID_IAMStreamConfig, (void**)&pConfig);

		//获取number数
		int iCnt, iSize;
		pConfig->GetNumberOfCapabilities(&iCnt, &iSize);

		//获取cps信息
		BYTE *pSCC = NULL;
		AM_MEDIA_TYPE *pmt;
		pSCC = new BYTE [iSize];
		if(pSCC == NULL)
		{
			AfxMessageBox(L"Allocate Memory Error",0,0);
			return;
		}
		//遍历
		for(int i=0; i<iCnt; i++)
		{
			pConfig->GetStreamCaps(i, &pmt, pSCC);	//获取信息

			//像素   VIDEO_STREAM_CONFIG_CAPS wince 接口
			LONG minx=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MinOutputSize.cx;
			LONG maxy=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MaxOutputSize.cy;

            //频率
			LONGLONG mini=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MinFrameInterval;
			LONGLONG maxi=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MaxFrameInterval;

			//通信速率
			LONG minrate=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MinBitsPerSecond;
			LONG maxrate=((VIDEO_STREAM_CONFIG_CAPS*)pSCC)->MaxBitsPerSecond;
			//形成信息字符串,用于打印显示
			CString cstr;
			cstr.Format(L"%d, %d, %d, %d, %d, %d",minx,maxy,mini,maxi,minrate,maxrate);
			AfxMessageBox((LPCTSTR)cstr,0,0);
			
			VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pmt->pbFormat;
		//	pvi->dwBitRate=minrate; //直接设置即可生效
            LONGLONG crate=pvi->dwBitRate;  
			LONG ctime=10000000.0/pvi->AvgTimePerFrame;  //帧频
			cstr.Format(L"%d, %d",crate,ctime);
			AfxMessageBox((LPCTSTR)cstr,0,0);
			_DeleteMediaType(pmt);	//删除
		}

		delete [] pSCC;
	}
	catch(std::runtime_error err)
	{
		MessageBox(NULL, _T("fail"),CString(err.what()), MB_OK);
		return;
	}
	
	return;
}

void CCamera::_DeleteMediaType(AM_MEDIA_TYPE *pmt)  
{  
    if (pmt != NULL)  
    {  
        _FreeMediaType(*pmt);   
        CoTaskMemFree(pmt);  
    }  
}  
void  CCamera::_FreeMediaType(AM_MEDIA_TYPE &mt)  
{  
    if (mt.cbFormat != 0)  
    {  
        CoTaskMemFree((PVOID)mt.pbFormat);  
        mt.cbFormat = 0;  
        mt.pbFormat = NULL;  
    }  
    if (mt.pUnk != NULL)  
    {  
        // pUnk should not be used.  
        mt.pUnk->Release();  
        mt.pUnk = NULL;  
    }  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值