通过Windows Media Foundation获取旋转摄像头图像:MF_MT_VIDEO_ROTATION无效排查
你的操作流程存在以下几个核心问题:
原生媒体类型不可修改
通过GetNativeMediaType获取的是摄像头硬件原生支持的媒体格式,绝大多数摄像头驱动不允许修改这类原生格式的MF_MT_VIDEO_ROTATION属性。即便SetUINT32调用返回成功,后续SetCurrentMediaType也会被设备忽略,因为硬件无法输出带旋转属性的原生帧数据。属性作用场景误解
MF_MT_VIDEO_ROTATION本质是一个指示性属性,而非让源阅读器直接输出旋转后帧的控制属性。它主要用于告知后续的媒体处理模块(如渲染器、编码MFT)需要对帧进行旋转,而非让源设备直接生成旋转后的图像。源阅读器本身不会主动解析这个属性来旋转输出帧。SetCurrentMediaType的局限性
多数USB摄像头的源阅读器仅接受其原生支持的媒体类型参数,修改后的带旋转属性的媒体类型不在设备支持列表内,SetCurrentMediaType可能返回成功但实际未生效,设备仍会输出原始方向的帧。
正确的实现思路
手动处理帧旋转
保持源阅读器的原生媒体类型不变,在调用ReadSample获取帧数据后,读取帧的MF_MT_VIDEO_ROTATION属性(或直接使用你期望的旋转角度),手动对图像缓冲区中的像素数据进行旋转处理。使用MFT处理旋转
创建专门的旋转MFT(如CLSID_VideoRotate),将其插入到媒体处理管线中,让MFT负责完成帧的旋转操作,无需修改源媒体类型。让渲染器自动处理
如果仅需在显示时旋转图像,可以将MF_MT_VIDEO_ROTATION属性设置在传递给渲染器的媒体类型上,或通过IMFVideoDisplayControl::SetRotation方法直接控制渲染器的旋转角度。
内容的提问来源于stack exchange,提问作者aniu

