Media Foundation开发:如何将H.264字节数组创建为自定义Media Source
Media Foundation实现内存H.264字节数组媒体源的解决方案
错误核心原因
自定义内存字节数组Media Source返回E_ATTRIBUTENOTFOUND,本质是实现的媒体源、对应流描述符没有补齐Media Foundation拓扑加载要求的强制属性,和数据源类型无关。Media Foundation不关心数据来自摄像头、本地文件还是网络内存,只要求媒体源按接口规范输出合规的媒体类型、样本与属性值。
低代码实现路径
不需要从零手写完整自定义Media Source,优先用系统内置组件实现,稳定性最高:
方案1:自定义内存字节流对接系统H.264解析器
MF原生支持从IMFByteStream抽象对象创建媒体源,无需绑定本地文件:
- 实现自定义
IMFByteStream接口,内部逻辑直接对接网络接收缓冲区,收到H.264字节数组后存入内部缓存队列,按接口读请求返回对应数据即可,不需要额外做格式封装 - 调用
MFCreateSourceResolver创建源解析器,传入自定义内存字节流对象,指定解析参数为MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENTDOESNOTHAVETOMATCH,源解析器会自动调用系统内置的H.264媒体源解析字节流,自动生成合规流描述符、补齐所有必填属性,从根源避免属性缺失错误 - 注意:传输的H.264流必须带标准起始码(
0x00000001)和SPS/PPS参数集,否则系统解析器无法识别流格式
方案2:自定义媒体源必填属性清单
如果因流格式特殊必须手写自定义Media Source,以下属性为强制必填项,缺项就会触发E_ATTRIBUTENOTFOUND错误:
- 媒体源级别必须设置
MF_MT_MAJOR_TYPE属性,值为MFMediaType_Video - 视频流描述符必须设置以下属性:
MF_MT_SUBTYPE:值为MFVideoFormat_H264MF_MT_FRAME_SIZE:对应视频实际分辨率宽高MF_MT_FRAME_RATE:对应视频实际帧率MF_MT_AVG_BITRATE:对应视频流平均码率MF_MT_INTERLACE_MODE:逐行流填MFVideoInterlace_Progressive,按实际流扫描模式设置即可
- 媒体源输出的每一个
IMFSample必须提前设置采样时间、采样时长属性,不能留空
MF.NET适配提示
你使用的MF.NET封装已经完成IMFByteStream、源解析器相关接口的C#映射,不需要自行转译C++ COM接口定义:
- 自定义字节流类直接继承封装库提供的
ByteStream基类,重写Read、GetLength、Seek核心方法即可,网络收到的H.264数据存入内部缓存队列,Read方法直接从队列取数据返回 - 不要尝试直接将字节数组传入媒体源,MF所有媒体源的输入统一走字节流抽象层,不管数据来自磁盘、网络还是内存,走官方抽象层的实现兼容性最高,不会出现非常规接口、属性错误。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

