笔记:关于 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。


你可能感兴趣的:(笔记:关于 FFMPEG 中时间戳的一点小知识(1))