微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何通过在 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 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。