开发环境:飞凌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;
}
}