u013745168 2017-07-26 08:45 采纳率: 0%
浏览 1414

请教关于directshow 虚拟摄像头无法切换分辨率的问题?

HRESULT STDMETHODCALLTYPE CVCamPin::GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC)
{
*pmt = CreateMediaType(&m_mt);
DECLARE_PTR(VIDEOINFOHEADER, pvi, (*pmt)->pbFormat);

//if (iIndex == 0) iIndex = 9;
int VCamX = 0;
int VCamY = 0;
switch (iIndex)
{
case 0:
{
VCamX = 320;
VCamY = 240;
break;
}
case 1:
{
VCamX = 640;
VCamY = 360;
break;
}
case 2:
{
VCamX = 640;
VCamY = 480;
break;
}
case 3:
{
VCamX = 800;
VCamY = 488;
break;
}
case 4:
{
VCamX = 800;
VCamY = 600;
break;
}
case 5:
{
VCamX = 960;
VCamY = 544;
break;
}
case 6:
{
VCamX = 1280;
VCamY = 720;
break;
}
case 7:
{
VCamX = 1280;
VCamY = 960;
break;
}
case 8:
{
VCamX = 1600;
VCamY = 900;
break;
}
case 9:
{
VCamX = 1920;
VCamY = 1080;
break;
}
}
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = VCamX;
pvi->bmiHeader.biHeight = VCamY;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;
pvi->rcTarget.left = 0;
pvi->rcTarget.right = VCamX;
pvi->rcTarget.top = 0;
pvi->rcTarget.bottom = VCamY;
pvi->rcSource.left = 0;
pvi->rcSource.right = VCamX;
pvi->rcSource.top = 0;
pvi->rcSource.bottom = VCamY;
pvi->AvgTimePerFrame = (1000000000 / 100) / 30;
pvi->dwBitRate = VCamX*abs(VCamY) * 3 * 30;
(*pmt)->majortype = MEDIATYPE_Video;
(*pmt)->subtype = MEDIASUBTYPE_RGB24;
(*pmt)->formattype = FORMAT_VideoInfo;
(*pmt)->bTemporalCompression = FALSE;
(*pmt)->bFixedSizeSamples = TRUE;
(*pmt)->lSampleSize = pvi->bmiHeader.biSizeImage;
(*pmt)->cbFormat = sizeof(VIDEOINFOHEADER);
DECLARE_PTR(VIDEO_STREAM_CONFIG_CAPS, pvscc, pSCC);
pvscc->guid = MEDIATYPE_Video;
pvscc->VideoStandard = AnalogVideo_None;
pvscc->InputSize.cx = 0;
pvscc->InputSize.cy = 0;
pvscc->MinCroppingSize.cx = 0;
pvscc->MinCroppingSize.cy = 0;
pvscc->MaxCroppingSize.cx = VCamX;
pvscc->MaxCroppingSize.cy = VCamY;
pvscc->CropGranularityX = 0;
pvscc->CropGranularityY = 0;
pvscc->CropAlignX = 0;
pvscc->CropAlignY = 0;
pvscc->MinOutputSize.cx = 0;
pvscc->MinOutputSize.cy = 0;
pvscc->MaxOutputSize.cx = VCamX;
pvscc->MaxOutputSize.cy = VCamY;
pvscc->OutputGranularityX = VCamX;
pvscc->OutputGranularityY = VCamY;
pvscc->StretchTapsX = 0;
pvscc->StretchTapsY = 0;
pvscc->ShrinkTapsX = 0;
pvscc->ShrinkTapsY = 0;
pvscc->MinFrameInterval = 200000;   //50 fps
pvscc->MaxFrameInterval = 50000000; // 0.2 fps
pvscc->MinBitsPerSecond = (320 * 240 * 3 * 8) / 5;
pvscc->MaxBitsPerSecond = VCamX * VCamY * 3 * 8 * 50;
return NOERROR;
}
这个函数 中给出10个可选的分辨率 摄像头可选的分辨率里面也显示
图片说明
我也重载了 SetFormat设置分辨率 的 函数 
HRESULT STDMETHODCALLTYPE CVCamPin::SetFormat(AM_MEDIA_TYPE *pmt)
{
DECLARE_PTR(VIDEOINFOHEADER, pvi, m_mt.pbFormat);
m_mt = *pmt;
IPin* pin;
CBasePin::ConnectedTo(&pin);
int nCount = 0;
CHAR str[256] = { 0 };
sprintf(str, "x==%d,y==%d", pvi->bmiHeader.biWidth, pvi->bmiHeader.biHeight);
MessageBox(NULL, str, NULL, MB_OK);
if (pin)
{
IFilterGraph *pGraph = m_pParent->GetGraph();
pGraph->Reconnect(this);
}
m_iImageWidth = pvi->bmiHeader.biWidth;
m_iImageHeight = pvi->bmiHeader.biHeight;
GetMediaType(1, &m_mt);
return S_OK;
}
但是我现在遇到一个问题,在更换分辨率的时候 SetFormat一直 收到 的 摄像头默认初始化的640*480 分辨率(GetMediaType 设置的一个分辨率)没有收到 那个选择分辨率,无论怎么切换 都不行,没法 获取想要的分辨率,但是我在opencv中 切换分辨率是 可以的 ,求大神指教一下是为什么?

  • 写回答

1条回答 默认 最新

  • qiuchangyong 2017-07-26 12:17
    关注

    参考AMCap的代码设置摄像头的输出pin上的流配置接口

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题