Media Foundation使用PROPVARIANT结构设置视频捕获帧速率

时间:2015-06-17 18:21:34

标签: c++ windows com ms-media-foundation

我正在编写媒体基础应用程序,我需要为视频设备设置捕获帧速率。我写作的功能类似于:

bool SetRequestedFrameRate(const size_t requestedFramesPerSecond);

其中我传递用户定义的整数作为帧速率参数。我正在关注https://msdn.microsoft.com/en-us/library/windows/desktop/ff485859(v=vs.85).aspx上的代码段:

PROPVARIANT var;
if (SUCCEEDED(pType->GetItem(MF_MT_FRAME_RATE_RANGE_MAX, &var)))
{
    hr = pType->SetItem(MF_MT_FRAME_RATE, var);

    PropVariantClear(&var);

    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->SetCurrentMediaType(pType);
}

显然它使用PROVARIANT结构来保存帧速率数据。但是如何从我的" const size_t requestedFramesPerSecond"构建一个PROVARIANT结构?参数?如果我已经拥有保持帧速率的PROVARIANT,我该如何从中检索实际的帧速率整数?此外,COM是否提供了一种比较表示帧速率的两个PROVARIANT结构的方法?

请帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

正如Roman指出的那样,您可以通过使用实用程序函数来访问PROPVARIANT存储来避免处理IMFAttributes结构。然而, #7指出page you referenced

  
      
  1. 查询MF_MT_FRAME_RATE_RANGE_MAX和MF_MT_FRAME_RATE_RANGE_MIN属性的媒体类型。该值给出了范围   支持的帧速率。设备可能支持其他帧速率   在此范围内。
  2.   

枚举捕获设备的本机媒体类型,只需选择(选择一个)并将媒体类型重用到set the current media type。否则,您将对失败的呼叫感到沮丧,这些呼叫与捕获设备的功能不匹配。我稍微讨论了帧速率,并展示了如何枚举本机媒体类型here。祝你好运。

答案 1 :(得分:1)

MF_MT_FRAME_RATE attribute是一对32位整数,表示分子和分母。 MFSetAttributeRatio和朋友是帮助者以友好的方式设置/获取值。使用PROVARIANT,您应该将其作为64位UINT64值处理。

  

帧速率表示为比率。属性值的高32位包含分子,低32位包含分母。例如,如果帧速率是每秒30帧(fps),则比率为30/1。如果帧速率为29.97 fps,则比率为30,000 / 1001。