我正在编写一个使用 MediaFoundation 的 H.264 解码器的应用程序。我的代码基于 this 示例。
只要我按照示例并为每个解码帧分配一个新的 IMFMediaBuffer ,一切似乎都可以正常工作。如果我尝试对后续帧重复使用相同的缓冲区,则
IMFTransform::ProcessOutput
内部的解码会失败,并出现异常“CopyDecodedFrame failed”。
函数“CopyDecodedFrame”和错误消息都没有在任何地方公开记录。解码器似乎没有保存对应用程序缓冲区的任何引用(由 AddRef/Release 返回值证明)。将“已用”缓冲区保留在池中并在几帧后重用它们也没有帮助。
我发现只有当提交的缓冲区为“空”(currentLength = 0)时解码器才能正常工作。调用
buffer->SetCurrentLength(0)
可以安全地重用缓冲区。
此要求似乎没有在任何地方记录。