Media Foundation读取部分H265视频返回错误分辨率的原因咨询
问题分析:Media Foundation Source Reader读取H265视频返回错误分辨率
原因说明
- H.265(HEVC)编码存在编码分辨率与显示分辨率分离的机制:为了适配编码树单元(CTU,通常为64x64)的对齐要求,原始视频分辨率会被向上对齐到CTU的整数倍,这个对齐后的尺寸是编码层面的帧存储尺寸。
- 你遇到的2176正是2160向上对齐到64倍数的结果:2160 ÷ 64 = 33.75,向上取整为34,34×64=2176。而
GetCurrentMediaType返回的MF_MT_FRAME_SIZE属性对应的是编码分辨率,并非视频实际的显示分辨率。 - 实际显示的有效分辨率需要从媒体类型的
MF_MT_MINIMUM_DISPLAY_APERTURE或MF_MT_PAN_SCAN_APERTURE属性中获取,这两个属性存储了视频需要展示的真实区域。
正确获取实际分辨率的代码示例
CComPtr<IMFSourceReader> r; CComPtr<IMFMediaType> NativeMT; MFCreateSourceReaderFromURL(L"file.mp4", 0, &r); r->GetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, &NativeMT); // 获取编码层面的帧存储尺寸 UINT codedWidth = 0, codedHeight = 0; MFGetAttributeSize(NativeMT, MF_MT_FRAME_SIZE, &codedWidth, &codedHeight); // 获取实际显示分辨率 UINT displayWidth = 0, displayHeight = 0; if (SUCCEEDED(MFGetAttributeSize(NativeMT, MF_MT_MINIMUM_DISPLAY_APERTURE, &displayWidth, &displayHeight))) { // 优先取最小显示光圈对应的尺寸,即实际显示分辨率 } else { // 无显示光圈属性时,回退到编码分辨率 displayWidth = codedWidth; displayHeight = codedHeight; }
转码失败的关联提示
转码失败大概率和编码/显示分辨率不匹配有关:Media Foundation转码器默认可能直接基于编码分辨率处理,导致输出异常。解决时需确保转码器的输出媒体类型正确配置显示区域,或强制匹配实际显示分辨率。
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

