如何使Media Foundation H.264解码器工作?

时间:2016-09-29 07:49:45

标签: h.264 ms-media-foundation transport-stream

出于某种原因,我无法解码H.264。 输入/输出配置运行良好,就像创建输入/输出缓冲区一样。

我正在手动为解码器提供从实时流中解复用的H.264。因此,我使用MFVideoFormat_H264_ES作为媒体子类型。解码非常慢并且解码的帧是完全垃圾。其他解码器正在正确解码相同的流。

奇怪的是,一旦ProcessInput()返回MF_E_NOTACCEPTING,以下ProcessOutput()将返回MF_E_TRANSFORM_NEED_MORE_INPUT。根据MSDN,这绝不应该发生。

有人可以提供一些具体信息吗? (假设MF H.264是功能性的,我很怀疑)。

我愿意提供额外的信息,但我不知道有人可能需要帮助。

编辑: 什么时候我应该将输入缓冲区中的字节数重置为零? 顺便说一下,当ProcessOutput()提供某些东西(垃圾)时,我正在重置输出缓冲区。

EDIT2: 在不将输入缓冲区上的当前缓冲区大小重置为0的情况下,我设法获得了一些半有效输出。半有效我的意思是在每个成功的ProcessOutput()上我收到一个YUV图像,其中当前图像包含比前一帧多的几个解码宏块。框架的其余部分是黑色的。因为我没有重置大小,这会在一段时间后停止。所以,我想重置缓冲区大小有一个问题,我想我应该在整个帧完成(或不完成)时得到一些通知。

EDIT3: 在创建输入缓冲区时,GetInputStreamInfo()返回4096作为输入缓冲区大小。对齐0.然而,4k是不够的。增加到4MB有助于逐帧解压缩帧。还是要弄清楚是否有办法判断整个帧何时被解码。

1 个答案:

答案 0 :(得分:1)

创建输入缓冲区时,GetInputStreamInfo()返回4096作为缓冲区大小,这个太小。 将输入缓冲区设置为4MB可解决此问题。缓冲区可能更小......仍需要测试它。