UWP使用特定宽高创建视频编码时MediaStreamSource.SampleRequested事件未触发
问题根因
你遇到的0xC00D5212错误是Media Foundation管线初始化失败导致的,系统无法为非标准宽高的IYUV/I420格式找到可用的颜色转换或渲染组件,核心触发点如下:
- I420(IYUV)属于YUV4:2:0采样格式,UV分量宽高均为Y分量的1/2,要求视频帧宽高必须为偶数,你报错场景的1037为奇数高度,不符合格式规范
- 缺失必填的编码参数校验也可能导致管线初始化中断
解决思路
- 强制对齐视频帧宽高:在送入MediaStreamSource前,先对原始帧做裁剪或补边操作,将宽高都调整为2的倍数,高分辨率场景可调整为4/16对齐适配硬件解码要求
- 补全编码属性配置:取消代码中Bitrate属性的注释,按I420 12bpp的规则正确赋值,避免参数校验失败
- 兼容格式声明:如果对齐后仍有异常,可给
VideoStreamDescriptor额外添加NV12、RGB32等系统支持度更高的格式声明,管线会自动匹配可用转换路径 - 排查第三方组件冲突:如果安装过第三方解码滤镜,可通过MFTRACE工具排查管线初始化阶段的模块加载日志,确认是否是自定义组件覆盖了内置YUV转换模块
修正后代码示例
private MediaStreamSource CreateI420VideoStreamSource(uint originalWidth, uint originalHeight,int framerate) { // 先将宽高对齐为2的倍数 uint width = originalWidth % 2 == 0 ? originalWidth : originalWidth + 1; uint height = originalHeight % 2 == 0 ? originalHeight : originalHeight + 1; if (width == 0) { throw new ArgumentException("Invalid zero width for video.", "width"); } if (height == 0) { throw new ArgumentException("Invalid zero height for video.", "height"); } var videoProperties = VideoEncodingProperties.CreateUncompressed(MediaEncodingSubtypes.Iyuv, width, height); var videoStreamDesc = new Windows.Media.Core.VideoStreamDescriptor(videoProperties); videoStreamDesc.EncodingProperties.FrameRate.Numerator = (uint)framerate; videoStreamDesc.EncodingProperties.FrameRate.Denominator = 1; videoStreamDesc.EncodingProperties.Height = height; videoStreamDesc.EncodingProperties.Width = width; // 补全Bitrate参数 videoStreamDesc.EncodingProperties.Bitrate = ((uint)framerate * width * height * 12); var videoStreamSource = new Windows.Media.Core.MediaStreamSource(videoStreamDesc); videoStreamSource.BufferTime = TimeSpan.Zero; videoStreamSource.SampleRequested += OnMediaStreamSourceRequested; videoStreamSource.IsLive = true; videoStreamSource.CanSeek = false; return videoStreamSource; }
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

