我试图使用Microsoft Media Foundation的IMFSourceReader(在Windows 7 x64上)从500万像素的UVC相机中拍摄视频。在第一次回调OnReadSample()之前,一切都像文档一样工作,没有任何API错误的调用,其中包含" 0x80070491索引中的指定键没有匹配"作为它的hrStatus参数。
当我将分辨率设置为1080p时,即使相机的原始分辨率为500万像素且5MP(2592x1944)也是可用格式,它也可以正常工作。
我无法在Microsoft文档中找到任何内容,说这种行为是设计的,但到目前为止似乎是一致的。有没有其他人让IMFSourceReader工作在1080p以上?
我在Microsoft MFCaptureToFile示例中看到相同的效果,因为它被迫选择原生分辨率:
HRESULT nativeTypeErrorCode = S_OK;
DWORD count = 0;
UINT32 streamIndex = 0;
UINT32 requiredWidth = 2592;
UINT32 requiredheight = 1944;
while ( nativeTypeErrorCode == S_OK )
{
IMFMediaType * nativeType = NULL;
nativeTypeErrorCode = m_pReader->GetNativeMediaType( streamIndex, count, &nativeType );
if ( nativeTypeErrorCode != S_OK ) continue;
// get the media type
GUID nativeGuid = { 0 };
hr = nativeType->GetGUID( MF_MT_SUBTYPE, &nativeGuid );
if ( FAILED( hr ) ) return hr;
UINT32 width, height;
hr = ::MFGetAttributeSize( nativeType, MF_MT_FRAME_SIZE, &width, &height );
if ( FAILED( hr ) ) return hr;
if ( nativeGuid == MFVideoFormat_YUY2 && width == requiredWidth && height == requiredheight )
{
// found native config, set it
hr = m_pReader->SetCurrentMediaType( streamIndex, NULL, nativeType );
if ( FAILED( hr ) ) return hr;
break;
}
SafeRelease( &nativeType );
count++;
}
媒体框架是否有一些未记录的最高解决方案?
答案 0 :(得分:0)
事实证明问题出在我使用的相机上,而不是媒体流式框架或UVC相机。
我已经切换回使用DirectShow样本抓取,到目前为止似乎工作正常。
答案 1 :(得分:0)
我使用从Amazon.com(ELP-USBFHD01M-L21)获得的USB相机模块在Windows 7上遇到了同样的问题。默认分辨率1920x1080x30fps(MJPEG)工作正常,但当我尝试选择1280x720x60fps(也是MJPEG,而不是h.264)时,我在ReadSample回调中得到0x80070491错误。各种其他分辨率可以正常工作,例如640x480x120fps。 1280x720x9fps(YUY2)也有效。
相机在Direct Show中以1280x720x60fps正常工作。
不幸的是,1280x720x60fps是我想用Oculus Rift做一些相当低延迟的增强现实效果的分辨率。
有趣的是,在Windows 10技术预览版中,1280x720x60fps与MFCaptureD3D示例一起正常工作。我尝试将ksthunk.sys和usbvideo.sys驱动程序从我的Windows 10安装程序复制到我的Windows 7计算机,但即使我在“禁用驱动程序签名”模式下启动它们也无法加载。
在浏览网页后,似乎有各种各样的网络摄像头遇到了这个问题。我将不得不使用DirectShow来进行视频捕获,这很烦人,因为它是一个非常旧的API,不能与应用商店应用程序一起使用。
我知道这是一个相当模糊的问题,但是由于微软似乎已经在Windows 10中修复了它,如果他们将修复程序向后移植到Windows 7会很棒。事实上,我不能使用他们推荐的媒体基础API因为它不能在我必须运行的大多数机器上运行。
在任何情况下,如果您遇到此问题,并且可以选择Windows 10,请尝试将其作为修复程序。
Max Behensky