一、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。