【问题标题】:Frame loss on file writing with DirectShow使用 DirectShow 写入文件时的帧丢失
【发布时间】:2018-12-03 21:06:11
【问题描述】:

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

我找到了一个相关的问题here,但这并没有给我答案。

【问题讨论】:

    标签: video video-capture directshow avi


    【解决方案1】:

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

    因此,您可以使用 IAMDroppedFrames 检查您的视频捕获过滤器,并在捕获过程中找出丢弃统计信息。

    接下来,您可以在 AVI Mux 之前检查视频帧的时间戳,并解释异常的时间间隔和丢帧。这可以在您已经在管道中拥有的任何自定义过滤器中完成,如果您没有任何自定义过滤器,则可以添加一个 Sample Grabber 实例来关注流式传输的内容。

    最后,一旦您的文件被创建并完成,您就可以回读视频轨道,并再次将帧时间与帧速率进行比较。一旦看到帧之间的距离大于预期的帧时间,就可以将其转换为丢帧数。

    【讨论】:

    • 如果您建议我应该寻找时间间隔,这是否意味着:我已处理所有帧,但传输中的抖动可能会导致复用器丢帧?估计推源过滤器的IAMDroppedFrames接口检测不到这种情况。
    • AVI 文件格式有固定帧率,抖动最终会被忽略。一个有效的源过滤器应该在生成的帧中有间隙。如果您有自定义推送源,那么您可能需要对其进行分析。它可能没有IAMDroppedFrames,并且它的时间戳行为在最坏的情况下可能会忽略完全丢弃的概念。
    • 是的,你的权利。自定义源过滤器不公开 IAMDroppedFrames。但是我记录了源和复用器之间的时间戳。使用 1kHz 的帧速率,每帧都很好(从任何帧到下一帧之间相差 10000 个单位)。帧速率为 80Hz(应该有 125000 个单位),它在 60000、100000 和 160000 之间变化(长期平均低于 125000)。这就是我所说的抖动。Muxer/Writer 似乎没有问题。但我不知道在慢速硬件上会发生什么。你不知道当复用器开始丢帧时的限制是什么。
    • 磁盘性能缓慢/不足最终会影响您的推送源并减慢其传送帧的能力。多路复用器,至少是这个简单的,不会因为性能而丢帧,它只检查分配的帧时间戳。
    【解决方案2】:

    如果您要保存到标准硬盘驱动器,请考虑改为保存到 SSD,因为它的速度要快得多,这样可以防止丢帧。

    如果需要太多空间,最终将 SSD 用作临时驱动器,然后在录制完成后,将 .avi 文件移动到后台硬盘驱动器。

    【讨论】:

    • 感谢您的建议。这真的很有意义。不幸的是,这超出了我们的控制范围。该软件作为标准软件安装在全球许多客户计算机上。有时它安装在非常小的计算机上是合理的。目标是在录音卡住时通知用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多