Video 使用DirectShow写入文件时的帧丢失

Video 使用DirectShow写入文件时的帧丢失,video,video-capture,directshow,avi,Video,Video Capture,Directshow,Avi,我们的应用程序将未压缩的视频帧写入avi文件。在性能不足的情况下,将丢弃帧(可能由Avi Muxer)。当然,这个问题无法解决。但我们的问题是,我们没有找到一种方法来通知用户这一点。我们测量发送给Avi复用器的帧速率,这是正确的。但是我们可以看到,由于写入性能不足,写入的avi文件中有丢失的帧。有人知道如何测量avi文件的写入帧数吗 我发现了一个相关的问题,但这并没有给我答案。帧被丢弃,因为写入未压缩的视频需要太多时间,这最终会阻塞管道,因此视频捕获过滤器的捕获延迟,捕获过滤器在捕获时必须丢弃

我们的应用程序将未压缩的视频帧写入avi文件。在性能不足的情况下,将丢弃帧(可能由Avi Muxer)。当然,这个问题无法解决。但我们的问题是,我们没有找到一种方法来通知用户这一点。我们测量发送给Avi复用器的帧速率,这是正确的。但是我们可以看到,由于写入性能不足,写入的avi文件中有丢失的帧。有人知道如何测量avi文件的写入帧数吗


我发现了一个相关的问题,但这并没有给我答案。

帧被丢弃,因为写入未压缩的视频需要太多时间,这最终会阻塞管道,因此视频捕获过滤器的捕获延迟,捕获过滤器在捕获时必须丢弃

因此,您可以检查您的视频捕获过滤器,并找出捕获过程中的下降统计数据

接下来,您可以在AVI Mux之前检查视频帧的时间戳,并解释掉帧的异常时间间隔。这可以在管道中已有的任何自定义过滤器中完成,如果没有,则可以添加一个示例抓取器实例来查看流式内容


最后,一旦你的文件被创建并完成,你可以读回视频曲目,然后再将帧数与帧速率进行比较。一旦你看到帧之间的距离大于预期的帧时间,你就可以把它转换成被丢弃的帧的数量。

如果你保存到一个标准的硬盘驱动器,考虑保存到一个SSD,因为它快得多,这可以防止掉帧。
如果需要太多空间,最终使用SSD作为临时驱动器,然后在录制完成后,将.avi文件移动到后台的硬盘驱动器。

如果您建议我查找时间间隔,这是否意味着:我已处理了所有帧,但传送过程中的抖动可能会导致muxer丢弃帧?我猜推送源过滤器的IAMDroppedFrames接口无法检测到这种情况。AVI文件格式具有固定的帧速率,抖动最终被忽略。有效的源过滤器在生成的帧中应该有间隙。如果您有自定义推送源,则可能需要对其进行配置。它可能没有
IAMDroppedFrames
,而且它的时间戳行为在最坏的情况下可能会忽略完全删除的概念。是的,你是对的。自定义源筛选器不公开IAMDroppedFrames。但是我记录了源和muxer之间的时间戳。帧速率为1kHz时,每个帧都可以(从任意帧到下一帧相差10000个单位)。帧速率为80Hz(应为125000个单位),在60000、100000和160000之间变化(长期平均值略低于125000)。这就是我所说的抖动。Muxer/Writer似乎没有问题。但是我不知道在一个缓慢的硬件上会发生什么。您不知道muxer开始丢弃帧的限制是什么。磁盘性能缓慢/不足最终会影响推送源并降低其传送帧的能力。多路复用器,至少这个简单的,不会因为性能而丢弃帧,它只检查指定的帧时间戳。谢谢你的建议。这确实有道理。不幸的是,这超出了我们的控制范围。该软件作为标准软件安装在世界各地的许多客户计算机上。有时,它安装在非常小的计算机上,处于合理性的边缘。目的是通知用户录音是否堵塞。