媒体基础使用PROPVARI结构设置视频捕获帧速率

Media Foundation set video capture frame rate using PROPVARIANT structure

本文关键字:视频 设置 帧速率 结构 PROPVARI 媒体      更新时间:2023-10-16

我正在编写一个媒体基础应用程序,我需要在其中设置视频设备的捕获帧速率。我正在编写的函数是这样的:

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 requestFramesPerSecond"参数构造一个PROVARI结构呢?如果我已经有一个保存帧速率的 PROVARIANT ,如何从中检索实际帧速率整数? 另外,COM 是否提供了一种方法来比较表示帧速率的两个 PROVARIANT 结构?

请帮忙,谢谢!

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

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

枚举捕获设备的本机媒体类型,只需选择(选择一个)并重复使用媒体类型即可设置当前媒体类型。 否则,您将对与捕获设备的功能不匹配的失败呼叫感到沮丧。 我稍微讨论了帧速率,并展示了如何在此处枚举本机媒体类型。 祝你好运。

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

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