我尝试在我的应用中使用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;
感谢您的帮助。
答案 0 :(得分:3)
相机可能不支持灵活的帧速率值,并且只能在支持的设置中使用,例如:10,15,20,24,30 fps。您应该能够枚举支持的媒体类型并选择适合您的媒体类型 - 这些媒体类型通常包括帧速率选项。
尽管Media Foundation和DirectShow视频捕获最终会在同一个后端结束,但行为可能存在差异。具体来说,您正在使用Media Foundation更高级别的API,该API在内部与媒体源接口,并且帧速率可能会导致0xC00D5212
MF_E_TOPO_CODEC_NOT_FOUND
“找不到合适的转换来编码或解码内容“混乱,即使技术上驾驶员可以在相应的模式下捕捉。
另见:
答案 1 :(得分:0)
我已将fps控制模仿的计时器添加到代码中。所以在开始时我设置30 fps,然后按fps比例我跳过我的应用程序的一些帧。 谢谢你的帮助。