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 解码器要求 N​​ALU 前面有起始码“00 00 00 01”。 See this SO answer 了解更多信息。在我提供给解码器的样本中,我不得不将 NALU 长度替换为“00 00 00 01”。

【讨论】:

以上是关于MF 不播放来自我的来源的视频的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NSData 播放视频

直播 HTML5 视频绘制到画布不工作

以字节格式录制和播放视频

如何弹出一个 jquery 窗口来播放 youtube 视频?

如何在 iframe 中禁用本地视频的自动播放

无法在videoview android中播放来自url的视频