【问题标题】:Media Foundation: Cannot change a FPS on webcam媒体基金会:无法更改网络摄像头上的 FPS
【发布时间】:2016-12-07 08:52:09
【问题描述】:

我尝试在我的应用程序中使用 Media Foundation ("MF") 上的 Directshow ("DS") 替换代码,但遇到了一个问题 - 无法在网络摄像头上使用 MF 设置所需的 fps。 MF 只允许我设置 30 fps。如果我尝试设置 25 fps,我总是在 SetCurrentMediaType() 上收到错误 0xc00d5212。在 DS 中,我可以更改该参数。

我的代码:

ASSERT(m_pReader); //IMFSourceReader *m_pReader;
IMFMediaType *pNativeType = NULL;
IMFMediaType *pType = NULL;
UINT32 w = 1280; 
UINT32 h = 720; 
UINT32 fps = 25; // or 30

DWORD dwStreamIndex = MF_SOURCE_READER_FIRST_VIDEO_STREAM;

// Find the native format of the stream.
HRESULT hr = m_pReader->GetNativeMediaType(dwStreamIndex, 0, &pNativeType);
if (FAILED(hr))
{
  //error
}

GUID majorType, subtype;

// Find the major type.
hr = pNativeType->GetGUID(MF_MT_MAJOR_TYPE, &majorType);
if (FAILED(hr))
{
  //error
}
// Define the output type.
hr = MFCreateMediaType(&pType);
if (FAILED(hr))
{
  //error
}
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, majorType);
if (FAILED(hr))
{
  //error
}
// Select a subtype.
if (majorType == MFMediaType_Video)
{
    subtype= MFVideoFormat_RGB24;
}
else
{
  //error
}
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
if (FAILED(hr))
{
  //error
}
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, w, h);
if (FAILED(hr))
{
  //error
}
hr = MFSetAttributeSize(pType, MF_MT_FRAME_RATE, fps, 1);
if (FAILED(hr))
{
  //error
}
hr = m_pReader->SetCurrentMediaType(dwStreamIndex, NULL, pType);
if (FAILED(hr))
{// hr = 0xc00d5212 
  //!!!!!error - if fps == 25 
}
return hr;

感谢您的帮助。

【问题讨论】:

    标签: c++ webcam directshow video-capture ms-media-foundation


    【解决方案1】:

    相机可能不支持灵活的帧速率值,并且只能在支持的集合中工作,例如:10、15、20、24、30 fps。您应该能够列举支持的媒体类型并选择适合您的媒体类型 - 这些媒体类型通常包括帧速率选项。

    尽管 Media Foundation 和 DirectShow 视频捕获最终在同一个后端结束,但行为上可能存在差异。具体来说,您正在使用内部接口到媒体源的媒体基金会更高级别的 API,并且帧速率可能会导致 0xC00D5212 MF_E_TOPO_CODEC_NOT_FOUND “没有找到合适的转换来编码或解码内容”甚至混淆尽管从技术上讲,驱动程序可以在各自的模式下捕获。

    另见:

    【讨论】:

    • 您好 Roman,我尝试了您的 MF 实用程序并得到以下结果:我的网络摄像头只能以 1 和 30 fps 的速度工作。但 DS 显示了另一件事 - 5、10、15、20、25 和 30 fps。为什么?或者网络摄像头只有 30 fps,但 DS 可以将该 fps 划分为其他帧速率?是真的吗?
    • 我认为 WDM 驱动程序报告了多个帧速率,但信息可能不完整并被 MF 层过滤掉。只是猜测 - 没有足够的信息可以确定任何事情。
    • 嗨,我认为这个限制与 UVC - USB 视频类 - 媒体基础驱动程序有关。它针对 WindowsStore 平台,并针对 USB 摄像头进行了优化,不仅可以获取 RGB 和 MJPEG 格式的视频,还可以获取来自硬件编码器的 H264 和 H265 格式的视频 - 因此它会导致功能受限。为了获得更多功能,您应该使用 DShow 或编写计时器,它将以所需的帧速率抓取帧。
    • Evgeny,感谢您提供的信息。如果我在应用程序中保留 DS,则根本不需要 MF。我的目标是将我的 DS 应用程序升级到 MF。计时器也是个坏主意,会增加 CPU 负载。
    • 经验法则是:如果您可以(可能,可以接受)将 DirectShow 用于特定任务,那么出于多种原因,您会很好地采用这种方式。维护,特别是可扩展性。特别是当它涉及视频捕获时。媒体基金会确实有其非常聪明的部分,但不是替代品。
    【解决方案2】:

    我已将用于 fps 控制模仿的计时器添加到代码中。所以一开始我设置了 30 fps ,然后通过 fps 比例我为我的应用跳过了一些帧。 谢谢你的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多