为什么 av_gettime() 返回值有正有负?

前言

av_gettime() 这个函数在 FFmpeg 的开发中,进行帧处理时最常用的一个函数。但是自己在最开始理解这个函数的时候,发现这个函数返回值十分的神奇。

因为它的 返回值有时是一个正值,有时又是一个负值!

为了解开这个神奇的现象,自己研究了半天,最后才发现原来是这么一回事 …

示例

代码

#include <stdio.h>
#include <libavutil/time.h>

int main(int argc, char const *argv[])
{
    printf("%d\n", av_gettime());
    return 0;
}

运行

gcc -o demo demo.c -w -L /usr/local/lib -lavutil && ./demo

现象
运行之后会打印一个正的十位数(或者是负的十位数),等待一段时间后再运行时你就可能会发现打印的是一个负的十位数(或者正的十位数)。

函数声明

想要解决这个问题,我们就需要回归到函数中去:

/**
 * Get the current time in microseconds.
 */
int64_t av_gettime(void)

函数声明中我们得到了两个信息:

  • 功能:以微秒为单位获取当前时间
  • 返回值:int64_t

分析

那么当前时间的返回值为多少呢?

获取当前时间

#include <sys/time.h>
#include <stdio.h>

int main()
{
    
    struct timeval tv;
    gettimeofday(&tv, NULL);
    
    printf("second: %ld\n", tv.tv_sec); // 秒
    printf("millisecond: %ld\n", tv.tv_sec * 1000 + tv.tv_usec / 1000); // 毫秒
    printf("microsecond: %ld\n", tv.tv_sec * 1000000 + tv.tv_usec); // 徽秒
}

对比打印结果发现我们这个程序微秒的返回值为一个16位的数字!

原因

这个时候我们就已经可以知道原因了:
av_gettime() 返回值为 int64_t,16位的时间戳数字对于它来说已经超出了它的最大表示值了,因此就会出现为负值的现象。

心得

  • 以后其他地方如果也出现了负值,那我们就可以考虑是不是范围问题了。
  • 涉及到数字的操作时一定要考虑选择的数据类型的范围,以及不同平台下某些数据类型范围不一样的问题。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值