2016-12-07 126 views
1

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

感谢您的帮助。

回答

3

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

尽管Media Foundation和DirectShow视频捕获最终会在相同的后端结束,但行为可能存在差异。特别是,您正在使用Media Foundation更高级别的API,该API在内部与媒体源进行接口连接,并且可能发生帧速率导致0xC00D5212MF_E_TOPO_CODEC_NOT_FOUND“没有找到合适的转换来编码或解码内容”混淆,即使技术上是驱动程序可以在各自的模式下捕捉。

参见:

+0

嗨罗马,我试了你的MF工具,并得到以下结果:我的摄像头只能工作在1和30帧/秒。但是DS展示了另外一些东西--5,10,15,20,25和30 fps。为什么?或者一个网络摄像头只有30帧/秒,但DS可以在其他帧速率上分割该帧?这是真的吗? –

+0

我认为WDM驱动程序报告多个帧速率,但信息可能不完整并被MF层过滤掉。只是猜测 - 没有足够的信息来确定任何事情。 –

+0

嗨,我认为这个限制与媒体基金会的UVC - USB Video Class - 驱动程序有关。它针对平台WindowsStore,并针对USB摄像头进行了优化,不仅可以获取RGB和MJPEG格式的视频,还可以使用硬件编码器的H264和H265格式 - 因此会导致功能受限。为了获得更多的功能,你应该使用DShow或写定时器,它将抓取具有所需帧速率的帧。 –

0

我添加了FPS控制仿计时器进入代码。所以在开始时,我设置了30 fps,然后以fps为单位跳过我的应用的一些帧。 谢谢你的帮助。