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

How to make Media Foundation H.264 decoder work?

出于某种原因,我无法解码 H.264。 input/output 配置顺利,就像 input/output 缓冲区创建一样。

我正在手动为解码器提供从直播流中解复用的 H.264。因此,我使用 MFVideoFormat_H264_ES 作为媒体子类型。解码速度很慢,解码后的帧完全是垃圾。其他解码器正在正确解码同一流。

奇怪的是,一旦 ProcessInput() returns MF_E_NOTACCEPTING,后面的 ProcessOutput() returns MF_E_TRANSFORM_NEED_MORE_INPUT。根据 MSDN,这永远不应该发生。

任何人都可以提供一些关于如何做的具体信息吗? (假设 MF H.264 是功能性的,我对此表示严重怀疑)。

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

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

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

编辑3: 创建输入缓冲区时,GetInputStreamInfo() returns 4096 作为输入缓冲区大小。对齐 0。但是,4k 是不够的。增加到 4MB 有助于逐帧解压帧片段。仍然需要弄清楚是否有办法判断整个帧何时解码。

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