C# IMFTTransform::ProcessInput在提交超过25个样本之前未返回样本 使用Windows Media Foundation和IMF对H264流进行解码时有点不知所措。

C# IMFTTransform::ProcessInput在提交超过25个样本之前未返回样本 使用Windows Media Foundation和IMF对H264流进行解码时有点不知所措。,c#,c++,ms-media-foundation,C#,C++,Ms Media Foundation,我发现,即使H264流将max_num_ref_frames定义为2,IMFTransform在输出任何内容之前需要输入超过25帧,并且IMFTransfer::input每次MF_E_TRANSFORM\u需要更多输入时都会返回 如果我把解码器的水抽干,它们就会全部出来;但问题是,这意味着它将无法解码上一个返回的样本和下一个关键帧之间的任何新样本 最大参考帧数为2帧(参考信息: max_num_ref_frames specifies the maximum number of short-t

我发现,即使H264流将
max_num_ref_frames
定义为2,IMFTransform在输出任何内容之前需要输入超过25帧,并且
IMFTransfer::input
每次
MF_E_TRANSFORM\u需要更多输入时都会返回

如果我把解码器的水抽干,它们就会全部出来;但问题是,这意味着它将无法解码上一个返回的样本和下一个关键帧之间的任何新样本

最大参考帧数为2帧(参考信息:

max_num_ref_frames specifies the maximum number of short-term and
long-term reference frames, complementary reference field pairs,
and non-paired reference fields that may be used by the decoding
process for inter prediction of any picture in the
sequence.)
解码器最多只需要缓冲2帧。不管怎样,H264可能需要的最大缓冲是16帧

使用
CODECAPI\u AVLowLatencyMode
属性()设置IMFTransform将有所帮助;但这仅在Windows 8上可用,并且不是通用解决方案,因为它无法正确处理B帧)

有什么建议吗?
TIA

我记不得了,但MF接受哪种NAL ByTestStream格式?这可能是因为它无法确定NAL单元的边界,因此不提供任何输出吗?由于25最有可能是GOP长度,您是否正确设置了关键帧采样标志?它将AnnexB作为输入。我们在每个关键帧之前添加SPS和PPS NAL。如何设置关键帧采样标志?我发现它只需要数据和时间戳。我假设它从NAL本身提取该标志;还是一样的交易:(.非常感谢你的指针,这是一个愚蠢的问题,但是你确定
max_num_ref_frames
是2吗?也许你应该尝试解析PPS来验证?如果你也执行编码,那么我想没有必要,因为你知道设置,但是如果流来自其他地方,可能值得检查since还有其他参数,如
max\u dec\u frame\u buffering
可能会影响此行为。您是否有导致此行为的位流示例?是的,我100%确定。我通过直接解析SP来检索值。使用其他解码器(不同平台),解码后的数据会按预期显示。我将很快发布到视频的链接。