我正在编写媒体基础应用程序,我需要为视频设备设置捕获帧速率。我写作的功能类似于:
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结构的方法?
请帮助,谢谢!
答案 0 :(得分:2)
正如Roman指出的那样,您可以通过使用实用程序函数来访问PROPVARIANT存储来避免处理IMFAttributes结构。然而, #7指出page you referenced:
- 查询MF_MT_FRAME_RATE_RANGE_MAX和MF_MT_FRAME_RATE_RANGE_MIN属性的媒体类型。该值给出了范围 支持的帧速率。设备可能支持其他帧速率 在此范围内。
醇>
枚举捕获设备的本机媒体类型,只需选择(选择一个)并将媒体类型重用到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。