directshow怎么枚举摄像头支持的所有分辨率和帧速

ljooo 2009-09-16 02:02:34
一般摄像头程序都有一个下拉列表框分辨率和帧速,在directshow里怎么做?谢谢。
...全文
738 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhygcy 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ljooo 的回复:]
你试了一下,上面代码可以获得罗技和飞利浦的摄像头的值,但不能获得索尼ps3设置头的值,iCount=11,而11个pmtPV都是完全一样的。奇怪的是,ps3摄像头在我电脑上可以用directshow打开,换别人的电脑就不行了。
[/Quote]
ps3的驱动自带AMCap吗?这个打开的camera可以调节分辨率吗?
ljooo 2009-09-17
  • 打赏
  • 举报
回复
应该说:我试了一下
ljooo 2009-09-17
  • 打赏
  • 举报
回复
你试了一下,上面代码可以获得罗技和飞利浦的摄像头的值,但不能获得索尼ps3设置头的值,iCount=11,而11个pmtPV都是完全一样的。奇怪的是,ps3摄像头在我电脑上可以用directshow打开,换别人的电脑就不行了。
ljooo 2009-09-17
  • 打赏
  • 举报
回复
那个驱动是人家破解的,一个是ps3专用的,装好后里面有AMCap,可以调节分辨率。别人电脑都只能用专用的,而我两个都能用。
hhygcy 2009-09-16
  • 打赏
  • 举报
回复 1
要用IAMStreamConfig的GetNumberOfCapabilities函数拿到数量
用GetStreamCaps来遍历所有的分辨率

HRESULT SetResolution()
{
// MYLOG("SetResolution");
HRESULT hr = S_OK;
CComPtr<IAMStreamConfig> pConfig;

CComPtr<IPin> previewPin = GetPinByName(pVideoCapture, TEXT("preview"));

if (previewPin == NULL)
{
MYLOG("fail to find the preview pin");

previewPin = GetPinByName(pVideoCapture, TEXT("capture"));
if (previewPin == NULL)
{
// no preview or still, fail here
return E_FAIL;
}
}

hr = previewPin->QueryInterface(&pConfig);
int iCount, iSize;
VIDEO_STREAM_CONFIG_CAPS caps;
pConfig->GetNumberOfCapabilities(&iCount, &iSize);
if (iCount == 0)
{
MYLOG("fail to GetNumberOfCapabilities");
return E_FAIL;
}

CameraCapacity* paCapacity = new CameraCapacity[iCount];
// find and save all the capacities
AM_MEDIA_TYPE *pmtPV=NULL;
for(int i=0;i<iCount;++i)
{
hr=pConfig->GetStreamCaps(i, &pmtPV, (BYTE*)&caps);
if (hr != S_OK)
{
MYLOG("fail to get stream caps");
}
else
{
if (pmtPV->subtype == MEDIASUBTYPE_YV12 ||
pmtPV->subtype == MEDIASUBTYPE_RGB565 ||
pmtPV->subtype == MEDIASUBTYPE_UYVY )
{
paCapacity[i].index = i;
paCapacity[i].width = caps.MaxOutputSize.cx;
paCapacity[i].height = caps.MaxOutputSize.cy;
paCapacity[i].guid = pmtPV->subtype;
MYLOG( "index = %d, width = %d, height = %d", paCapacity[i].index, paCapacity[i].width, paCapacity[i].height);

// to correct the value;
if (paCapacity[i].width < 0)
paCapacity[i].width *= -1;
if (paCapacity[i].height < 0)
paCapacity[i].height *= -1;
}
DeleteMediaType(pmtPV);
}
}

// here, we need find the most suitable size.
int suitableIndex = findSuitableResolution(paCapacity,iCount) ;

g_suitableResolution = paCapacity[suitableIndex];
if (IsEqualGUID (g_suitableResolution.guid,MEDIASUBTYPE_RGB565))
{
g_bVerticalFlip = true;
}

hr=pConfig->GetStreamCaps(paCapacity[suitableIndex].index, &pmtPV, (BYTE*)&caps);
delete [] paCapacity;
if(hr== S_OK)
{
hr=pConfig->SetFormat(pmtPV);
DeleteMediaType(pmtPV);
}
else
{
MYLOG("Fail to set format");
}
previewPin.Release();
previewPin = NULL;
return hr;
}

上面是偶以前写过的一段代码
ljooo 2009-09-16
  • 打赏
  • 举报
回复
我要获得的是
320×240 @30 fps
320×240 @60 fps
320×240 @75 fps
640×480 @30 fps
……
这样的列表。

微软那个AMCAP程序菜单Options/Video Capture Pin... 就是,它弹出一个对话框,但不是完全由程序创建的(我在那个项目里找不到任何代码),而是摄像头自身的带的,弹出来给用户看。但我不需要用户看,而是要给程序看,由程序自己选择。
Opencv里用一条语句cvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE) 弹出一样的框给用户看,程序看不到弹出的内容是什么。

1楼你能详细点吗?
yktd26 2009-09-16
  • 打赏
  • 举报
回复
IPin的EnumMediaTypes

2,552

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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