如何通过在 C 中丢帧来降低传入流的 fps

问题描述

我有一个 30FPS 的 jpeg 流。我想通过丢弃数据包来降低 fps。

我可以通过每秒丢弃一个包来达到 15FPS,例如:if(frameCount % 2) continue;

使用 if(frameCount % 3) continue;

也可以达到 20 FPS

我正在努力寻找一个条件来适应所有 FPS。
喜欢 5FPS?从理论上讲,我必须降低 25 FPS,但是我如何管理它,以便帧具有大约 25 FPS。它们之间的持续时间相同吗?

解决方法

基本上,如果您想丢帧以便每获得 30 个作为输入输出 15 个帧,那么每个输入帧将输出 0.5 个帧。类似地,对于 30->20 的丢弃,您每个输入帧输出 0.67 帧。

因此,作为一个简单的解决方案,您可以计算预期输出的帧的小数部分,并在该计数达到 1 或更高时输出单个帧。

作为一个粗略的草图,只有一个整数循环取代了框架:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    double sum = 0;
    double rate = argc >= 2 ? atoi(argv[1]) / 30.0 : 0.5;

    for (int i = 0; i < 30; i++) {
        sum += rate;
        if (sum >= 1) {
            sum -= 1;
            /* pretend we output this frame */
            printf("%d\n",i);
        }
    }
}

foo 20 或类似方式运行以打印 30 个中的 20 个。

或者大约 30 中的 20。由于舍入问题,这并不完全准确,而且 2/3 不能完全表示为二进制浮点值。您可以将其修改为用有理数来计数,因此可以精确地表示 20/30。

当然,任何不能精确除以 30 的除法器都会产生抖动输出。


对于 5 FPS,您可以再次使用模数,因为 5 正好除以 30。只需将测试的意义从丢弃分数转换为接受分数,例如if (framenumber % 5 == 0) { accept frame }