MF 无法播放来自我的源的视频

MF doesn't play video from my source

本文关键字:我的 的视频 自我 播放 MF      更新时间:2023-10-16

我正在开发一个基于媒体基础的h264播放器,从我自己的自定义媒体源播放h264视频和HE-AAC音频。

我的原型不播放视频,只播放音频。如何解决?

问题来了。我打开了我的URL。

该框架创建并初始化我的媒体源,然后创建并初始化音频和视频这两个流。

然后它要求视频样本,直到到达文件的末尾。日志中填充了CMFTransformDetours::ProcessOutput failed hr=0xC000D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT

然后,在我的视频流发送MEEndOfStream后,框架要求再提供几个音频样本,最终将状态转换为播放,并开始只播放音频。

该框架试图在我的视频流中找到什么?

如果由内置流源打开,则相同的文件由相同的播放器代码播放OK。mftrace.exe说,当内置流源播放文件时,第一个视频样本比我的流源播放它时长38字节(所有其他样本的长度完全相同)。38字节正是我的视频的MF_MT_MPEG_SEQUENCE_HEADER的大小(即00 00 01+SPS+00 00 01+PPS)。我试图在第一帧中预先设置MF_MT_MPEG_SEQUENCE_HEADER值,但没有帮助。

系统提供的流源在视频样本上设置了未记录的属性,GUID={19124E7C-AD4B-465F-BB18-20186287B6AF},值是8字节的二进制值,如"09 00 00 29 0d 00 00 00",并更改每一帧——这是什么原因?

我还能尝试什么?

有没有关于MFh264解码器在输入时到底想要什么的文档?

提前谢谢。

我的代码中有两个主要问题。

  1. 我的流源没有输出GUID为{19124E7C-AD4B-465F-BB18-20186287B6AF}的属性该属性有文档记录,只是MFTrace.exe日志记录工具不知道,所以它打印GUID而不是名称。GUID代表MF_NAMELU_LENGTH_INFORMATION属性

我的视频流描述符的MF_NAMELU_LENGTH_SET属性设置为TRUE。这就是为什么h264解码器跳过了我所有的视频样本——它在它们上寻找MF_NAMELU_LENGTH_INFORMATION属性,但它不存在。

简单的修复方法--从描述符中删除MF_NAMELU_LENGTH_SET,解码器在没有该数据的情况下也可以。

  1. 对于这个原型,我从.mp4容器中读取了视频样本。容器中的NALU前面是它们的长度(以字节为单位)。MS解码器要求NALU前面加上起始代码"00 00 00 01"。请参阅此SO答案以了解更多信息。在我提供给解码器的样本中,我不得不将NALU长度替换为"00 00 00 01">