笔记:关于 FFMPEG 中时间戳的一点小知识(1)

一、AVRational time_base //时间戳显示的时间单位

typedef struct AVRational{
    int num; ///< numerator
    int den; ///< denominator
} AVRational;


举例来说,如果 time_base.num = 1,time_base.den = 90000,则时间戳(PTS、DTS等)是以 1/90000 秒为单位显示的,

也就是说,如果next_pts - this_pts = 3000,则两个时间戳之间的时间间隔是 1 / 90000 * 3000 = 1/30 秒。


二、FPS  //  帧率(每秒内的帧数,frames per second)

如果 FPS = 30,则每秒内有 30 帧,或者说,每秒显示30个画面。


FFMPEG中,可以通过以下方法获取视频流的FPS:

AVStream* stream_video = ...;

double fps = av_q2d(stream_video->avg_frame_rate);


三、duration  // 某个 frame 的持续时间(以相应的 time_base 为单位)


四、三者关系可用以下公式表达:

duration = (1 / FPS) / (time_base.num / time_base.den)


举例来说:

FPS = 30,time_base = {1, 90000},则

duration = (1 / 30) / (1 / 90000) = 3000,


可以这么理解:

帧率是 30 HZ,每帧的持续时间是 1 / 30 秒,时间单位是 1 / 90000 秒,  那么,每帧的 duration 就是 3000 个时间单位。


备注:FFMPEG 中,对于视频来说,一个 packet 恰好包含一个 frame。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值