问题描述
我有一个 30FPS 的 jpeg 流。我想通过丢弃数据包来降低 fps。
我可以通过每秒丢弃一个包来达到 15FPS,例如:if(frameCount % 2) continue;
使用 if(frameCount % 3) continue;
我正在努力寻找一个条件来适应所有 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 }