MF 不播放来自我的来源的视频

MF doesn't play video from my source

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

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

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

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

然后它要求提供视频样本,直到到达文件末尾。 日志里满是CMFTransformDetours::ProcessOutput failed 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. 我的流源没有输出 GUID = {19124E7C-AD4B-465F-BB18-20186287B6AF} 的那些属性 该属性已记录,只是 MFTrace.exe 日志记录工具不知道,因此它打印 GUID 而不是名称。 GUID 代表 MF_NALU_LENGTH_INFORMATION 属性。

我的视频流描述符的 MF_NALU_LENGTH_SET 属性设置为 TRUE。这就是 h264 解码器跳过我所有视频样本的原因 - 它在它们上寻找 MF_NALU_LENGTH_INFORMATION 属性,但不存在。

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

  1. 对于这个原型,我从 .mp4 容器中读取了视频样本。容器中的 NALU 前面有它们的字节长度。 MS 解码器要求 N​​ALU 前面有起始码“00 00 00 01”。 See this SO answer 了解更多相关信息。在我提供给解码器的样本中,我不得不用“00 00 00 01”替换 NALU 长度。