【ffmpeg】DTS PTS

来源:互联网 发布:天下第一知乎 编辑:程序博客网 时间:2024/05/06 08:22

DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码显示帧时相对于SCR(系统参考)的时间戳

SCR可以理解为解码器应该开始从磁盘读取数据时的时间。
mpeg文件中的每一个包都有一个SCR时间戳并且这个时间戳就是读取这个数据包时的系统时间。通常情况下,解码器会在它开始读取mpeg流时启动系统时钟(系统时钟的初始值是第一个数据包的SCR值,通常为0但也可以不从0开始)。
DTS时间戳决定了解码器在SCR时间等于DTS时间时进行解码(没整明白,呵呵),PTS时间戳也是类似的。通常,DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时间。例如,如果一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差不多是200/280ms,表明当SCR到200ms时这个视频数据应该被解码,并在80ms以后被显示出来(视频数据在一个buffer中一直保存到开始解码)(这个意思啊?扯淡啊)

PTS:Presentation Time Stamp
DTS:Decoding Time Stamp
PCR:Program Clock Reference
STC:System Time Clock

1. SCR
SCR是存在于PS中的,即PS的pack里面的一个field。他用来指定这个PS的pack期望的到达decoder的时间。

2. ESCR
ESCR是位于PES里面的,即PES的header里面可能会有,当PES的packet要表示一个PESstream的时候,PES packet里面的ESCR就表示这个PES packet的所期望的到达decoder的时间。

3.PCR
PCR是TS里面的,即TSpacket的header里面可能会有,他用来指定所期望的该tspacket到达decoder的时间,他的作用于SCR类似。

4.DTS, PTS
对于一个ES来说,比如视频,他又许多I,P,B帧,而P,B帧都是以I,P帧作为参考。由于B帧是前向后向参考,因此要对B帧作decode的话,就必须先decode该B帧后面的P,或者I帧,于是,decode的时间与帧的真正的present的时间就不一致了,按照DTS一次对各个帧进行decode,然后再按照PTS对各个帧进行展现

有时候PES包头里面也会有DTS,PTS,对于PTS来说,他代表了这个PES包得payload里面的第一个完整地audioaccess unit或者video access unit的PTS时间(并不是每个audio/videoaccess unit都带有PTS/DTS,因此,你可以在PES里面指定一个,作为开始)。

PES包头的DTS也是这个原理,只不过注意的是:对于video来说他的DTS和PTS是可以不一样的,因为B帧的存在使其顺序可以倒置。而对于audio来说,audio没有双向的预测,他的DTS和PTS可以看成是一个顺序的,因此可一直采用一个,即可只采用PTS