AV时间戳dts,pts。图析ffmpeg解码序列。

解码过程中,dts由媒体流读入的包推动(解码包中的dts标记),dts在前进。pts是在dts前进到某处(截点)而进行动作的标记。

物理时间自然流逝,dts可以被控制同步与物理时间同一脚步节奏,也可以不。

一个节目的各条流(一般就一视频一音频,再加一字幕)共同参照dts。

流的各帧正确在物理世界呈现,pts必须参照物理时间与物理时间同步。

 

上图是mp4文件的解码,由于P,B要参考I,B需要正向参考P,所以某一帧被解码呈现的时候,已经被安排读入前前后后的几帧(这里的帧不专指主帧),所以pts会编排成dts之后。上图所示,pts:133的主帧安排在dts:0时加载,pts:333的B帧安排在dts:66时加载,pts:266的B帧安排在dts:133时加载。

又由于音频各帧独立,所以可以直接读入直接进行解码,pts和dts编排成一致。

 

上图在dts进行至133时(图中最右一个AVPacket编码帧),对pts=133的视频帧(图中最左一个AVPacket编码帧)解码。

解码出的帧dts打上当前的dts。在下面的AVFrame结构中,pkt_pts和pkt_dst是从AVPacket解码出来的时间截,而pts用于编码成AVPacket。

 

2020补充:

dts,理解成正在流逝的时钟时间。当然不是物理时钟时间。

pts,理解成计划任务时间,dts到点了就执行任务。

dts排序成一条时间轴,可以控制前进后退。

pts排序成一条队列,dts到达时触发执行。

posted on 2016-10-26 21:59  bbqz007  阅读(819)  评论(0编辑  收藏  举报