MediaFoundation SinkWriter编码H264/MP4的分辨率约束问题咨询
你好,结合我在MediaFoundation上的开发经验,来给你梳理下SinkWriter编码H264/MP4时,关于分辨率的所有关键约束,帮你找到最接近原帧尺寸的有效输出分辨率:
必须是偶数尺寸:这是H264编码标准的硬要求,因为编码核心的宏块是16x16的固定大小,奇数的宽或高会导致宏块无法对齐,直接触发
0xc00d36b4这类无效媒体类型错误,所以第一步必须把原帧的宽高调整为最近的偶数(比如原1001x701,可调整为1000x700或1002x702,看你更倾向于保留原尺寸的哪一侧)。不能超过编码器的最大分辨率上限:你提到的
CODECAPI_AVDecVideoMaxCodedWidth和CODECAPI_AVDecVideoMaxCodedHeight其实是解码器属性,编码器对应的应该是CODECAPI_AVEncVideoMaxCodedWidth和CODECAPI_AVEncVideoMaxCodedHeight,通过查询IMFTransform的属性可以拿到编码器支持的最大宽高,比如大部分消费级软件/硬件编码器最大支持4K(3840x2160),老设备可能只到1080P,超过这个上限肯定会失败。部分编码器要求宽高是16/32/64的倍数:除了奇偶,很多硬件编码器(比如Intel Quick Sync、NVIDIA NVENC)会要求分辨率是16的倍数,甚至是32或64的倍数,这是因为硬件编码单元的对齐要求更严格。比如原尺寸是1922x1082,即使是偶数,也可能因为不是16的倍数被拒绝,这时候可以调整为1920x1080(16的倍数)或者1920x1088,尽量贴近原尺寸。
宽高比与编码器支持范围:有些编码器对宽高比有要求,只支持标准比例(比如16:9、4:3、1:1),如果你的原帧是非常特殊的宽高比(比如1000x700,约1.428:1),即使尺寸符合前面的要求,也可能因为编码器不支持该比例而失败。这种情况下,要么调整到最近的标准比例对应的尺寸,要么查询
CODECAPI_AVEncVideoAspectRatio相关属性确认编码器是否支持自定义宽高比。最小分辨率限制:别忽略最小尺寸!很多编码器有最低分辨率要求,比如不能低于176x144,如果你处理的是极小的帧(比如64x64),哪怕是偶数也可能报错,这时候可以查询
CODECAPI_AVEncVideoMinCodedWidth和CODECAPI_AVEncVideoMinCodedHeight来确认下限。
最后给你个实践小建议:调整分辨率时,优先保证符合奇偶和编码器的倍数要求,然后尽量贴近原尺寸的宽高比,同时不触碰最大/最小限制,这样既能拿到最接近原帧的输出,又能避免编码失败。
内容来源于stack exchange

