c++ - 媒体基金会 : Cannot change a FPS on webcam

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

我尝试在我的应用程序中使用 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;

感谢您的帮助。

最佳答案

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

尽管 Media Foundation 和 DirectShow 视频捕获最终位于同一后端,但行为上可能存在差异。具体来说,您正在使用媒体基础更高级别的 API,该 API 在内部连接到媒体源,并且帧速率可能会导致 0xC00D5212 MF_E_TOPO_CODEC_NOT_FOUND “没有合适的转换发现对内容进行编码或解码”的困惑,即使从技术上讲驱动程序可以在相应的模式下捕获。

另请参阅:

关于c++ - 媒体基金会 : Cannot change a FPS on webcam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41013005/

相关文章:

c++ - 游戏引擎中的对象层次结构实现

webcam - DirectShow - Microsoft LifeCam Studio - RBG24 格式丢失

c# - 从网络摄像头输入以编程方式更新 WPF 图像控件

unity3d - 是否可以将ffmpeg输出流式传输到虚拟网络摄像头/虚拟捕获设备/AVFoundation对象?

windows - 如何调试 H264 DirectShow 过滤器?

c++ - 如何确定要 dynamic_cast 到哪种类型?

c++ - popen 与来自 C++ 的系统调用

video - 当两者都接受 ARGB32 媒体类型时,引脚之间没有组合

c++ - 列表初始化的返回类型是什么?

c# - 用于DirectShow的Matroska Muxer过滤器