jason--liu/Blog

FFmpeg中的pts和dts

jason--liu opened this issue · 0 comments

名称解释

  • pts
    Presentation Time Stamp pts 主要度量解码后的视频帧什么时候显示出来
  • dts
    Decode Time Stamp dts 主要标记读入内存中的bit流在什么时候开始送入解码器中进行解码
    也就是说pts反应帧什么时候开始显示,dts反应数据流什么时候开始解码

时间基即时间刻度

ptsdts的值就是占多少个时间刻度;时间刻度理解:如果把1秒分为25等份,那么每一格就是1/25秒,此时的时间基(time_base)={1, 25};所以pts和dts的单位不是秒而是时间刻度,只有pts和time_base结合起来才是时间秒。

time_seconds=pts*time_base

时间基转换

为什么需要转换?不同的封装格式,timebase不一样,另外整个解码过程,不同的数据状态对应的时间基也不一样。
根据pts來计算一个帧在视频中的时间位置:
timestamp(秒) = pts * av_q2d(st->time_base)

duration字段和pts单位一样,也是“多少个格子”
计算视频长度;
time(秒) = st->duration * av_q2d(st->time_base)

秒转时间戳
timestamp = AV_TIME_BASE * time_in_seconds

ffmpeg同样为我们提供了不同时间基之间的转换函数:

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding rnd)

其中a是需要转换的时间刻度,bq是输入时间基,cq是输出时间基

参考资料

理解ffmpeg中的pts,dts,time_base
ffmpeg中的时间
对ffmpeg的时间戳的理解笔记
ffmpeg中的时间戳与时间基