FFmpeg中的时间戳表示方法

ffmpeg中的时间单位
1. AV_TIME_BASE
ffmpeg中的内部计时单位(时钟基),ffmepg中的所有时间表示的单位,
比如AVStream中的duration, 即表示这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:
#define AV_TIME_BASE 1000000
 
2. AV_TIME_BASE_Q
ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。
从它的定义能很清楚的看到这点:
#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
 
AVRatioal的定义如下:
typedef struct AVRational{ int num; //numerator int den; //denominator } AVRational;

ffmpeg提供了一个把AVRatioal结构转换成double的函数:
static inline double av_q2d(AVRational a){ /*** Convert rational to double.* @param a rational to convert**/ return a.num / ( double ) a.den;}

现在可以根据pts来计算一桢在整个视频中的时间位置:
timestamp(秒) = pts * av_q2d(st->time_base)
 
计算视频长度的方法:
time(秒) = st->duration * av_q2d(st->time_base)
 
这里的st是一个AVStream对象指针。

3. 时钟基转换公式
  • timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
  • time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

所以当需要把视频跳转到N秒的时候可以使用下面的方法:
int64_t timestamp = N * AV_TIME_BASE; av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

ffmpeg同样为我们提供了不同时间基之间的转换函数:
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);

这个函数的作用是计算a * bq / cq,来把时间戳从一个时基调整到另外一个时基。
在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值