FFmpeg中的pts和dts
jason--liu opened this issue · 0 comments
jason--liu commented
名称解释
- pts
Presentation Time Stamp pts 主要度量解码后的视频帧什么时候显示出来 - dts
Decode Time Stamp dts 主要标记读入内存中的bit流在什么时候开始送入解码器中进行解码
也就是说pts反应帧什么时候开始显示,dts反应数据流什么时候开始解码
时间基即时间刻度
pts
和dts
的值就是占多少个时间刻度;时间刻度理解:如果把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中的时间戳与时间基