MF不从我的来源播放视频

时间:2015-04-30 03:22:38

标签: c++ windows video h.264 ms-media-foundation

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

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

这是问题所在。我打开我的网址。

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

然后它会询问视频样本,直到到达文件末尾。 日志填充CMFTransformDetours :: ProcessOutput失败hr = 0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT

然后在我的视频流发送MEEndOfStream后,框架会要求更多的音频样本,最后将状态转换为播放,并开始播放音频。

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

如果由内置流源打开,则相同的播放器代码可以播放相同的文件。 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 00 29 0d 00 00”,并更改每一帧 - 那是什么,它可能是什么原因?

我还能尝试什么?

有没有关于MF h264解码器究竟在输入上需要什么的文档?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

  1. 我的流源未使用GUID = {19124E7C-AD4B-465F-BB18-20186287B6AF}输出这些属性 该属性已记录,只是MFTrace.exe日志记录工具不知道所以它打印GUID而不是名称。 GUID代表MF_NALU_LENGTH_INFORMATION attruibute。
  2. 我的视频流描述符的MF_NALU_LENGTH_SET属性设置为TRUE。这就是h264解码器跳过我所有视频样本的原因 - 它在它们上面寻找MF_NALU_LENGTH_INFORMATION属性,但它不在那里。

    简单的修复方法 - 从描述符中删除MF_NALU_LENGTH_SET,没有该数据,解码器就可以了。

    1. 对于这个原型,我从.mp4容器中读取视频样本。容器中的NALU以其字节长度开头。 MS解码器要求NALU前面有起始码“00 00 00 01”。 See this SO answer了解有关此内容的更多信息。在我提供给解码器的样本中,我必须用“00 00 00 01”替换NALU长度。