DirectShow技术,某些摄像头不能调节分辨率

xiaoqiangsun 2013-05-16 04:48:42
根据网上的一些资料,用IAMStreamConfig接口已经实现了获取摄像头支持的分辨率;然后用setformat也成功设置了一些摄像头的分辨率,但是,,我目前程序用在平板设备上,结果,Surface上可以的,Tablet2一直不行,永远是445*225的,但是得到支持的分辨率从1280*720一直到445不等有很多。。

很急哎,软件想在445的分辨率太dt了,有没有人碰到过有些摄像头也不能设置分辨率的;指教指教。

我的代码是这样的:

有一些变量先声明一下
IGraphBuilder *m_pGB;//filter最大容器
IAMStreamConfig *m_pSC; //设备
ICaptureGraphBuilder2* m_pCapture;
IBaseFilter* m_pBF;
IMediaControl* m_pMC;//采集媒体使用接口
IVideoWindow* m_pVW;//采集视屏使用接口
CComPtr <ISampleGrabber> m_pGrabber;


HRESULT hr;
hr = InitCaptureGraphBuilder(iDeviceID);
if (FAILED(hr))
{
AfxMessageBox("Failed to get video interfaces!");
return hr;
}
// create a sample grabber
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabber )
{
AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not registered?");
return hr;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );

//上面是初始化一些东西,没什么问题


//设置视频格式
//分辨率

AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );

m_pSC->GetNumberOfCapabilities(&count, &size);
CString strMsg;
AM_MEDIA_TYPE* mtPtr;
VIDEOINFOHEADER *vihPtr = NULL;
for (int i = 0; i < pixelTypeSize; i ++)
{
m_pSC->GetStreamCaps(j, &mtPtr, reinterpret_cast<BYTE*>(&pSCC));
long cbPixel = 2;

VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(mtPtr->pbFormat);
pVih->bmiHeader.biWidth = width;
pVih->bmiHeader.biHeight = height;
//我这边省略了一些东西,排序了一下,反正得到的width和height是支持里面得到的

mtPtr->lSampleSize = pVih->bmiHeader.biSizeImage = ((width+3)&~3)*height*cbPixel;

hr = m_pSC->SetFormat(mtPtr);
if(FAILED(hr))
continue;


hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ))
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
//hr = m_pGrabber->SetMediaType(mtPtr);
if( SUCCEEDED(hr))
{
break;
}
}

if(FAILED(hr))
return hr;
hr = m_pGrabber->GetConnectedMediaType(&mt);
if (FAILED(hr))
return hr;
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
////***关键就是这里通过GetConnectedMediaType得到的Width和height永远是445....
所以后面就是445了,之前设置的都没有起效果。。。


大致就是这样。。。
...全文
444 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 jlei_apple 的回复:
请问楼主问题解决了吗?现在我在surface下遇到同样问题,不能指定分辨率,麻烦问楼主在surface下怎么解决的,多谢多谢!
不知道你的分辨率是用来预览[PREVIEW],还是用来拍照[STILL] ? 两个不一样的
leijuan_apple 2014-11-05
  • 打赏
  • 举报
回复
请问楼主问题解决了吗?现在我在surface下遇到同样问题,不能指定分辨率,麻烦问楼主在surface下怎么解决的,多谢多谢!
waslcp 2014-07-29
  • 打赏
  • 举报
回复
请问最后解决了吗?我现在也是table2,获取不到,求解!!!!
xiaoqiangsun 2013-05-21
  • 打赏
  • 举报
回复
引用 3 楼 Q52077987 的回复:
建议先使用AmCap设置一下,如果AmCap也不可以就难办了,如果可以设置就参考下AmCap的源代码。AmCap是微软在DirectShow中提供的测试工具,有源代码的。
我一开始就下载了AmCap试过了,,,也是不行。在Tablet2上只显示两个两类像素:宽度600多的和400多的,但是它本身可以达到很大的像素
Q52077987 2013-05-21
  • 打赏
  • 举报
回复
建议先使用AmCap设置一下,如果AmCap也不可以就难办了,如果可以设置就参考下AmCap的源代码。AmCap是微软在DirectShow中提供的测试工具,有源代码的。
xiaoqiangsun 2013-05-20
  • 打赏
  • 举报
回复
求救啊》。。。。
xiaoqiangsun 2013-05-16
  • 打赏
  • 举报
回复
没有人做过类似的么........

19,469

社区成员

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

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