免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3319 | 回复: 7
打印 上一主题 下一主题

[算法] 调整FPS的算法问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-17 15:49 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <sys/time.h>

  6. static long begin_time;
  7. static long end_time;
  8. static long frame_counter;

  9. void conv_fps2itimerval(int fps, struct itimerval *value)
  10. {
  11.     value->it_value.tv_sec = 0;
  12.     value->it_value.tv_usec = 1000000/fps;
  13.     value->it_interval.tv_sec = 0;
  14.     value->it_interval.tv_usec = 1000000/fps;
  15. }

  16. void *sigroutine(int signo)
  17. {
  18.     if (SIGALRM == signo) {
  19.         //
  20.         // 在这里动态调整fps,请问相关的算法什么呀,谢啦~
  21.         //
  22.         ++frame_counter;

  23.         struct timeval val;
  24.         if (-1 == gettimeofday(&val, NULL)) {
  25.             perror("gettimeofday");
  26.             exit(1);
  27.         }
  28.         end_time = val.tv_sec*1000000 + val.tv_usec;
  29.         long gap_time = end_time - begin_time;
  30.         if (gap_time > 1000000) {
  31.             printf("current fps is: %.3lf\n", frame_counter*1000000/(double) gap_time);
  32.             begin_time = end_time;
  33.             frame_counter = 0;
  34.         }
  35.     }
  36.     return (void *) NULL;
  37. }

  38. int main(int argc, char **argv)
  39. {
  40.     struct itimerval value;

  41.     if (SIG_ERR == signal(SIGALRM, (__sighandler_t) sigroutine)) {
  42.         perror("signal");
  43.         exit(1);
  44.     }

  45.     conv_fps2itimerval(25, &value); // 设置每秒钟产生25次中断

  46.     if (-1 == setitimer(ITIMER_REAL, &value, NULL)) {
  47.         perror("setitimer");
  48.         exit(1);
  49.     }

  50.     for ( ; ; ) {
  51.         usleep(10);
  52.     }

  53.     return 0;
  54. }
复制代码
程序中设置了每秒钟产生25次中断,模拟25fps的情况。现在求一个算法,
把25fps降到一个特定值(例如10fps),~~~
{:3_200:}

论坛徽章:
0
2 [报告]
发表于 2013-06-17 16:15 |只看该作者
conv_fps2itimerval(10, &value); //25改成10试试

    if (-1 == setitimer(ITIMER_REAL, &value, NULL)) {
        perror("setitimer");
        exit(1);
    }

论坛徽章:
0
3 [报告]
发表于 2013-06-17 16:16 |只看该作者
lrita 发表于 2013-06-17 16:15
conv_fps2itimerval(10, &value); //25改成10试试

    if (-1 == setitimer(ITIMER_REAL, &value, NULL) ...

把这几行封装成一个函数。

论坛徽章:
0
4 [报告]
发表于 2013-06-17 16:37 |只看该作者
lrita 发表于 2013-06-17 16:15
conv_fps2itimerval(10, &value); //25改成10试试

    if (-1 == setitimer(ITIMER_REAL, &value, NULL) ...

改为10确实就变成10fps,但要求是将原本的25fps通过一定的算法降到10fps。
咱的算法很烂,求大牛赐教,~~

论坛徽章:
0
5 [报告]
发表于 2013-06-17 16:41 |只看该作者
意思是中断还是25个 但是frame只++10次?

论坛徽章:
0
6 [报告]
发表于 2013-06-17 16:45 |只看该作者
lrita 发表于 2013-06-17 16:41
意思是中断还是25个 但是frame只++10次?

中断还是25个,然后在sigroutine中,想办法每秒钟均匀得从原来的25帧里面提取出10帧,~~

论坛徽章:
0
7 [报告]
发表于 2013-06-17 16:52 |只看该作者
这个就不清楚了,最好还是去看下ffmpeg里转码部分是怎么取舍帧数的吧。

论坛徽章:
0
8 [报告]
发表于 2013-06-17 16:56 |只看该作者
lrita 发表于 2013-06-17 16:52
这个就不清楚了,最好还是去看下ffmpeg里转码部分是怎么取舍帧数的吧。

好的,这就去看看先,,谢啦~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP