将RGB转NV12后编码H264时触发E_INVALIDARG错误,寻求解决方案
RGB转NV12后H264编码触发E_INVALIDARG错误排查方案
核心排查方向:
输入媒体类型严格匹配
确认传递给IMFTransform::ProcessInput的IMFSample携带的媒体类型,与编码器IMFTransform预先设置的输入类型完全一致。重点核对:MF_MT_SUBTYPE必须为MFVideoFormat_NV12MF_MT_FRAME_SIZE的宽高是否符合编码器要求(多数H264编码器要求宽高为16的倍数,若桌面分辨率不满足需先做缩放)MF_MT_DEFAULT_STRIDE的Y平面和UV平面步长是否正确计算(Y步长通常是向上对齐到4或8的宽度,UV步长为Y步长的一半)
可通过IMFMediaType::Compare方法直接对比两个类型,确保无参数差异。
IMFSample数据完整性校验
即便NV12纹理验证正确,打包为IMFSample时仍可能出错:- 检查Sample的时间戳(
MFSampleSetPresentationTime/MFSampleSetDuration)是否合法,避免传入0或超出编码器时间范围的值 - 确认
IMFMediaBuffer的数据长度:Y平面大小为width*height,UV平面为width*height/2,总长度需完全匹配 - 调用
IMFMediaBuffer::Lock后,检查数据指针是否正确指向Y、UV平面的起始位置,无偏移或截断
- 检查Sample的时间戳(
编码器状态与调用流程合规性
- 调用
ProcessInput前,确保编码器已切换至MFT_PROCESSING_STATE_RUNNING状态:初始化后需调用IMFTransform::ProcessMessage(MFT_MESSAGE_SET_STREAM_STATE, MFT_STREAM_STATE_RUNNING) - 避免连续多次调用
ProcessInput而不调用ProcessOutput,多数H264编码器有输入缓存上限,未及时输出会导致后续操作失败 - 若之前有错误或重置操作,需先调用
ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH)清空缓存
- 调用
输出媒体类型参数排查
E_INVALIDARG可能间接来自输出类型配置错误:- 优先使用编码器默认输出类型(通过
IMFTransform::GetOutputAvailableType获取),再逐步调整比特率、帧率、Profile等参数 - 避免手动设置超出编码器支持范围的参数(如设置不支持的H264 High Profile)
- 优先使用编码器默认输出类型(通过
启用MFT调试日志
配置注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaFoundation\Transforms\Debug,将EnableDebugOutput设为1,可获取MFT输出的详细错误日志,定位具体非法参数。
内容的提问来源于stack exchange,提问作者liang.good
相关产品推荐
相关产品推荐

