C#使用SharpDx录扩展屏调用SetInputMediaType出现HRESULT:0xC00D36B4错误
问题根因
你遇到的0xC00D36B4错误对应的是Media Foundation框架的MF_E_INVALIDMEDIATYPE异常,即你设置的输入媒体类型不被Sink Writer接受。主屏录制正常、扩展屏异常,通常是扩展屏的参数计算异常、媒体属性缺失导致的兼容性问题。
排查&修复方案
- 首先校验第二屏的宽高参数合法性
检查你获取第二屏分辨率的逻辑,如果扩展屏的起始坐标是负值(比如放在主屏左侧),直接用右边界减左边界可能得到负的宽高值,在做((long)width << 32) | (uint)height计算时会产生非法的超大帧尺寸,直接触发类型不兼容错误。需要先把宽高转成无符号整数再进行位运算。 - 补充必填的媒体类型属性
你当前的MediaType设置缺失两个必选属性,高分辨率场景下Sink会直接拒绝:- 逐行扫描标识:
video.Set(MediaTypeAttributeKeys.InterlaceMode, (int)VideoInterlaceMode.Progressive); - 行跨度属性:
video.Set(MediaTypeAttributeKeys.Stride, width * 4);(RGB32格式每像素占4字节,行跨度为宽度*4)
- 逐行扫描标识:
- 可选优化兼容性操作
如果修复参数后依然报错,可以把子类型从VideoFormatGuids.Rgb32替换为VideoFormatGuids.NV12,系统内置编码器对NV12格式的兼容性远高于RGB32,适配不同分辨率场景的能力更强。
修复后核心代码示例
using (var video = new MediaType()) { // 提前校验宽高合法性,强制转无符号 uint uWidth = (uint)Math.Abs(width); uint uHeight = (uint)Math.Abs(height); video.Set(MediaTypeAttributeKeys.MajorType, MediaTypeGuids.Video); video.Set(MediaTypeAttributeKeys.Subtype, VideoFormatGuids.Rgb32); video.Set(MediaTypeAttributeKeys.FrameSize, ((long)uWidth << 32) | uHeight); // 新增必选属性 video.Set(MediaTypeAttributeKeys.InterlaceMode, (int)VideoInterlaceMode.Progressive); video.Set(MediaTypeAttributeKeys.Stride, (int)(uWidth * 4)); if (Options.RecordingFrameRate != 0) { video.Set(MediaTypeAttributeKeys.FrameRate, ((long)frameRateNumerator << 32) | (uint)frameRateDenominator); // 补充比特率属性,提升兼容性 uint bitrate = uWidth * uHeight * 4 * (uint)frameRateNumerator / (uint)frameRateDenominator; video.Set(MediaTypeAttributeKeys.AvgBitrate, bitrate); } Trace("Add Video Input Media Type"); writer.SetInputMediaType(_videoOutputIndex, video, null); }
内容的提问来源于stack exchange,提问作者Selim Boz
相关产品推荐
相关产品推荐

