MF 不播放来自我的来源的视频
Posted
技术标签:
【中文标题】MF 不播放来自我的来源的视频【英文标题】:MF doesn't play video from my source 【发布时间】:2015-04-30 03:22:38 【问题描述】:我正在开发一个基于媒体基础的 h264 播放器,用于播放来自我自己的自定义媒体源的 h264 视频和 HE-AAC 音频。
我的原型不播放视频,只播放音频。 如何解决?
这就是问题所在。我打开我的网址。
框架创建并初始化我的媒体源,然后创建并初始化我的 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 解码器究竟想要输入什么?
提前致谢。
【问题讨论】:
不确定是否有帮助,但序列和图片参数集通常有 4 字节起始码 (00 00 00 01)。可能是解码器正在寻找那个。 【参考方案1】:我的代码中有两个主要问题。
-
我的流源没有输出那些 GUID = 19124E7C-AD4B-465F-BB18-20186287B6AF 的属性
该属性已记录在案,只是 MFTrace.exe 日志记录工具不知道,因此它打印 GUID 而不是名称。 GUID 代表MF_NALU_LENGTH_INFORMATION attruibute。
我的视频流描述符的 MF_NALU_LENGTH_SET 属性设置为 TRUE。这就是为什么 h264 解码器跳过了我所有的视频样本 - 它在它们上寻找 MF_NALU_LENGTH_INFORMATION 属性,但它不存在。
简单的修复方法 - 从描述符中删除 MF_NALU_LENGTH_SET,解码器没有该数据是可以的。
-
对于这个原型,我从 .mp4 容器中读取了视频样本。容器中的 NALU 前面是它们的字节长度。 MS 解码器要求 NALU 前面有起始码“00 00 00 01”。 See this SO answer 了解更多信息。在我提供给解码器的样本中,我不得不将 NALU 长度替换为“00 00 00 01”。
【讨论】:
以上是关于MF 不播放来自我的来源的视频的主要内容,如果未能解决你的问题,请参考以下文章