为什么使用IAMStreamConfig不能改变摄像头分辨率?

mm_lvw 2008-08-27 05:11:51
代码如下,但pConfig根本没有获取到数据,为什么没有获取数据呢?請赐教
我是设置了断点测试的!


length_24bit = 0L;
length_8bit = 0L;
data_24bit=NULL;
data_8bit=NULL;

HRESULT hr;
//initialize data
hr = InitCaptureGraphBuilder();
if (FAILED(hr))
{
AfxMessageBox(L"Failed to get video interfaces!");
return hr;
}

//bind object device
if(!BindFilter(iDeviceID, &m_pBF))
return S_FALSE;

hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");

//create ISampleGrabber module
hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_ISampleGrabber, (void**)&m_pGrabber );
if(FAILED(hr))
{
AfxMessageBox(L"Fail to create SampleGrabber, maybe qedit.dll is not registered?");
return hr;
}

//add Grabber Filer
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase(m_pGrabber);
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
if(FAILED(hr))
{
AfxMessageBox(L"Fail to put sample grabber in graph");
return hr;
}

//configure video format
AM_MEDIA_TYPE * AMT = new AM_MEDIA_TYPE;
ZeroMemory(AMT, sizeof(AM_MEDIA_TYPE));

m_pCapture->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,m_pBF, IID_IAMStreamConfig, (void **)&pConfig); <-问题出在这?????????????pConfig没获得数据
pConfig->GetFormat(&AMT);

AMT->majortype = MEDIATYPE_Video;
AMT->subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(AMT);
if(FAILED(hr))
{
AfxMessageBox(L"set media type error");
return hr;
}

//capture instant image
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pVW,pGrabBase,NULL);


if( FAILED(hr))
{
AfxMessageBox(L"Can't build the graph");
return hr;
}

//load video format
hr = m_pGrabber->GetConnectedMediaType(AMT);
if (FAILED(hr))
{
AfxMessageBox(L"connect media type error");
return hr;
}

VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) AMT->pbFormat;

//
//vih->bmiHeader.biWidth=960;
//vih->bmiHeader.biHeight=720;


m_pSampleGrabberCB->SetWidth(vih->bmiHeader.biWidth);
m_pSampleGrabberCB->SetHeight(vih->bmiHeader.biHeight);



m_pSampleGrabberCB->SetbGrabVideo(TRUE);

if (AMT->cbFormat != 0)
{
//Free Media Type
CoTaskMemFree((PVOID)AMT->pbFormat);
AMT->cbFormat = 0;
AMT->pbFormat = NULL;
if (AMT->pUnk != NULL)
{
AMT->pUnk->Release();
AMT->pUnk = NULL;
}
}

//using call-back module
hr = m_pGrabber->SetBufferSamples(FALSE);
hr = m_pGrabber->SetOneShot(FALSE);
hr = m_pGrabber->SetCallback(m_pSampleGrabberCB,1);

//configure Video Window
m_hWnd = hWnd ;
m_pVW->put_Owner((OAHWND)m_hWnd);
m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
if (m_pVW)
{
CRect rc;
::GetClientRect(m_hWnd,&rc);
m_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);
}

//begin to capture video frame
hr = m_pMC->Run();
if(FAILED(hr))
{
AfxMessageBox(L"Couldn't run the graph!");
return hr;
}
...全文
2627 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

摄像头不能随意改变分辨率~~

你只能使用摄像头支持的

C/C++ code

CComPtr<IAMStreamConfig> pCfg = 0;;
hr = m_pCameraOutput->QueryInterface(IID_IAMStreamConfig,(void **)&pCfg);
int……
[/Quote]
我想问下,在setform()时,出了错误,查SDK找到是VFW_E_WRONG_STATE 这个错,提示是
The operation could not be performed because the filter is in the wrong state. 0x80040227 。这个错是什么原因???
sakouya 2011-08-31
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
御猫 2011-04-22
  • 打赏
  • 举报
回复
路过,学习!
大龄代码农民 2008-11-05
  • 打赏
  • 举报
回复
摄像头不能随意改变分辨率~~

你只能使用摄像头支持的


CComPtr<IAMStreamConfig> pCfg = 0;;
hr = m_pCameraOutput->QueryInterface(IID_IAMStreamConfig,(void **)&pCfg);
int iCount = 0, iSize = 0;
hr = pCfg->GetNumberOfCapabilities(&iCount, &iSize);
if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
{
// Use the video capabilities structure.
for (int iFormat = 0; iFormat < iCount; iFormat++)
{
VIDEO_STREAM_CONFIG_CAPS scc;
VIDEOINFOHEADER* pVih;
BITMAPINFOHEADER* pBih = NULL;
AM_MEDIA_TYPE *pmtConfig;
hr = pCfg->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
if (SUCCEEDED(hr))
{
/* Examine the format, and possibly use it. */
pVih=(VIDEOINFOHEADER*)pmtConfig->pbFormat;
pBih=&pVih->bmiHeader;
int width =pBih->biWidth;
int height=pBih->biHeight;
if (width == nWidth&&(height == nHeight||height == -nHeight))
{
pVih->AvgTimePerFrame = 10000000/15;
hr = pCfg->SetFormat(pmtConfig);
MYFREEMEDIATYPE(*pmtConfig);
break;
}
MYFREEMEDIATYPE(*pmtConfig);
}
}
}
mm_lvw 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xqhrs232 的回复:]
hr = g_AMStreamCfg->GetFormat(&pmt);
if (FAILED(hr))
return hr;


VIDEOINFOHEADER* m_pVih= (VIDEOINFOHEADER *) (pmt->pbFormat);

RETAILMSG(1,(TEXT("++++1111::CaptureVideo( )----the Width is 0x%x,the Height is 0x%x\n"),m_pVih->bmiHeader.biWidth,m_pVih->bmiHeader.biHeight));


//m_pVih->bmiHeader.biWidth =800;
// m_pVih->bmiHeader.biHeight=480;


m_pVih->bmiHeader.bi…
[/Quote]

我看你的步骤跟我的步骤差不多,但我找不到你设置不成功的原因,关于断开FILTER链路,我也不大清楚,总的来說我对DS开发不很熟悉,在这帮不了你,很感抱歉,对了,你可以看看DXSDK里面的例子,或许对你有帮助
zhi_shui_yu 2008-10-21
  • 打赏
  • 举报
回复
救命啊,我也碰到这个问题了,也是不起作用

IAMStreamConfig *pSC;
hr = m_pCapture->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF, IID_IAMStreamConfig, (void **)&pSC);
if ( FAILED(hr) ) return;
AM_MEDIA_TYPE* pMediaType;
hr = pSC->GetFormat(&pMediaType);//get the media type
if ( FAILED(hr) ) return;

VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) pMediaType->pbFormat;
vih->bmiHeader.biWidth = 320;//set with pixel
vih->bmiHeader.biHeight = 240;//set high pixel
vih->bmiHeader.biSize = pMediaType->lSampleSize;//////////////////
pSC->SetFormat(pMediaType);//set the media type
xqhrs232 2008-10-17
  • 打赏
  • 举报
回复
hr = g_AMStreamCfg->GetFormat(&pmt);
if (FAILED(hr))
return hr;


VIDEOINFOHEADER* m_pVih= (VIDEOINFOHEADER *) (pmt->pbFormat);

RETAILMSG(1,(TEXT("++++1111::CaptureVideo( )----the Width is 0x%x,the Height is 0x%x\n"),m_pVih->bmiHeader.biWidth,m_pVih->bmiHeader.biHeight));


//m_pVih->bmiHeader.biWidth =800;
// m_pVih->bmiHeader.biHeight=480;


m_pVih->bmiHeader.biWidth =320;
m_pVih->bmiHeader.biHeight=240;





//2008--10--17 xqh 设置不成功!!!
hr=g_AMStreamCfg->SetFormat(pmt);

if (FAILED(hr))
return hr;

//-------------------------------------------------
//先读再写,我传的值也在范围之内-------------为什么在设置的时候不成功,看网上说要断开什么FILTER链路
,不知道是什么意思!





xqhrs232 2008-10-17
  • 打赏
  • 举报
回复
哦,我自己整错了。可以访问到IID_IAMStreamConfig 接口了,但设置的时候还是不成功啊!可以随便设置大小吗?
xqhrs232 2008-10-17
  • 打赏
  • 举报
回复
//2008--10--17 xqh 在这个地方不能成功获取IID_IAMStreamConfig接口

//ICaptureGraphBuilder2* g_pCapture = NULL;
//IGraphBuilder* g_pGraph = NULL;

//hr = g_pCapture->QueryInterface(IID_IAMStreamConfig, (LPVOID *) &g_AMStreamCfg);

hr = g_pGraph->QueryInterface(IID_IAMStreamConfig, (LPVOID *) &g_AMStreamCfg);

if (FAILED(hr))
return hr;

hr = g_AMStreamCfg->GetFormat(&pmt);

VIDEOINFOHEADER* m_pVih= (VIDEOINFOHEADER *) (pmt->pbFormat);

m_pVih->bmiHeader.biWidth =800;
m_pVih->bmiHeader.biHeight=480;

g_AMStreamCfg->SetFormat(pmt);


//=============================
我的那个接口都找不到-----IID_IAMStreamConfig

我的平台是CE60下,我是在g_pCapture->RenderStream之前对格式进行改变!!!


mm_lvw 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xqhrs232 的回复:]
楼主也不把怎么解决的方法说一下真是的
[/Quote]


已经很久没看这个了,我把代码贴出,你看看,希望对你有帮助
注意,先GetFormat,再SetFormat,这个基本步骤一定要有!
//add IAMStreamConfig interface
hr = m_CaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_BaseFilter, IID_IAMStreamConfig, (void **)&m_Config);
if ( FAILED(hr) )
{
AfxMessageBox(L"create IAMStreamConfig error");
return hr;
}
m_Config->GetFormat(&aMediaType);//get the media type
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat;


if (pixelHigh == 0 || pixelWith == 0)
{}
else
{
vih->bmiHeader.biWidth=pixelWith;//set with pixel
vih->bmiHeader.biHeight=pixelHigh;//set high pixel
}

vih->bmiHeader.biSize = aMediaType->lSampleSize;//////////////////
m_SampleGrabberCB->SetWidth(vih->bmiHeader.biWidth);
m_SampleGrabberCB->SetHeight(vih->bmiHeader.biHeight);
m_Config->SetFormat(aMediaType);//set the media type
xqhrs232 2008-10-17
  • 打赏
  • 举报
回复
楼主也不把怎么解决的方法说一下真是的
hewittlee 2008-08-29
  • 打赏
  • 举报
回复
ok
jjfwenwenti 2008-08-29
  • 打赏
  • 举报
回复
恭喜接分
mm_lvw 2008-08-29
  • 打赏
  • 举报
回复
问题已解决
mm_lvw 2008-08-28
  • 打赏
  • 举报
回复
我再把问题說清楚点吧
我想使用IAMStreamConfig改变摄像头的分辨率,但以下代码运行后m_Config跟本获取不了数据,因此运行到m_Config->GetFormat(aMediaType);就出错了,代码如下:

IAMStreamConfig * m_Config;
AM_MEDIA_TYPE * aMediaType = new AM_MEDIA_TYPE;

m_CaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,m_BaseFilter, IID_IAMStreamConfig, (void **)&m_Config);
m_Config->GetFormat(aMediaType);


請高手指点???

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧