ffmpeg 的时间
名词解释
PTS:播放时间戳DTS:解码时间戳
注意:如果没有 B 帧,那么 PTS 和 PTS 是一样的
音视频流中有一些信息表明了,音视频以多快的速度播放,音频是采样率,视频则是帧率
ffmpeg 中的时间单位
AV_TIME_BASE:ffmpeg 的时间单位,也叫做时间基。ffmpeg 中的时间单位不是秒,而是AV_TIME_BASE,所有的时间都是以他为单位的。定义如下:
#define AV_TIME_BASE 1000000
AV_TIME_BASE_Q:时间基的倒数,实际是 (AVRational){1, AV_TIME_BASE},也就是 1/
AV_TIME_BASE。
AVRational 表示分数,定义如下:
typedef struct AVRational{
int num; //分子
int den; //分母
} AVRational;
另外,可以用 av_q2d 函数 把 AVRational 转换成浮点数
ffmpeg 的时间计算
4.1、根据 pts 计算真实的时间(秒):
timestamp = pts * av_q2d(st→time_base)
4.2、根据 duration 计算视频的长度:
time = st->duration * av_q2d(st->time_base)
4.3、时间转换公式:
ffmpeg 内部时间:timestamp(ffmpeg 内部时间戳) = AV_TIME_BASE * time(秒)
常规时间:time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg 内部时间戳)
4.4、视频跳转的方法:
int64_t timestamp = N * AV_TIME_BASE;
av_seek_frame(fmtctx, index_of_video, timestamp,AVSEEK_FLAG_BACKWARD);
4.5、不同的时间基之间的转换:
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)