我尝试在我的应用程序中使用Media Foundation(“MF”)上的Directshow(“DS”)替换代码,并遇到一个问题 - 无法在网络摄像机上使用MF设置所需的fps 。 MF允许我只设置30 fps。如果我尝试设置25 fps,我总是在SetCurrentMediaType()上得到错误0xc00d5212。在DS中,我可以更改该参数。媒体基金会:无法更改摄像头上的FPS
我的代码:
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;
感谢您的帮助。
嗨罗马,我试了你的MF工具,并得到以下结果:我的摄像头只能工作在1和30帧/秒。但是DS展示了另外一些东西--5,10,15,20,25和30 fps。为什么?或者一个网络摄像头只有30帧/秒,但DS可以在其他帧速率上分割该帧?这是真的吗? –
我认为WDM驱动程序报告多个帧速率,但信息可能不完整并被MF层过滤掉。只是猜测 - 没有足够的信息来确定任何事情。 –
嗨,我认为这个限制与媒体基金会的UVC - USB Video Class - 驱动程序有关。它针对平台WindowsStore,并针对USB摄像头进行了优化,不仅可以获取RGB和MJPEG格式的视频,还可以使用硬件编码器的H264和H265格式 - 因此会导致功能受限。为了获得更多的功能,你应该使用DShow或写定时器,它将抓取具有所需帧速率的帧。 –