在 DirectShow 编码器上设置关键帧间隔

Setting Keyframe interval on DirectShow Encoder

我在播放视频时看到一些奇怪的行为,我使用 DirectShow 创建了视频 - 问题仅在 Windows 7 上(W8/W10 工作正常)。

图表是这样构建的:

Source(Webcam) -> H264 Encoder -> MP4 Mux -> File Writer

所以我使用的是 H264 编码器,但是由于某种原因,编码器在编码器过滤器之后删除了所有关键帧(同步)。使用另一个较旧的 H264 编码器,我可以看到它完美地每 20 帧设置一个关键帧(同步),并且该编码器的输出文件在所有操作系统上都能完美运行。

所以我怀疑问题在于编码器没有正确设置关键帧,因此将无法正确寻找(但是 Windows 8 和 10 可以弄清楚如何在没有关键帧的情况下正确寻找文件, 只是不 Windows 7)

Using VLC/WMP on Windows 7 搜索文件时文件异常(长时间无视频,灰色像素化视频超过10秒,视频突然停止.. )

所以我的问题是,如何在 DirectShow 的编码过滤器上设置关键帧的间隔?

编辑:我发现的另一件有趣的事情是,当我搜索时,在播放期间通过分析器过滤器(插入解码器之后)可以看到这个奇怪的输出。

关键帧的插入由编码器决定。它可能有一个设置来定义 GOP 长度和关键帧的最小频率。它可能会在场景变化时另外插入一个关键帧。它还可能接受外部请求以在特定点插入。

通用方法是 IAMVideoCompression::put_KeyFrameRate。同时我会说它是特定于编码器的。您应该查看您正在使用的特定编码器的文档,以了解如何操作。