之前尝试了对视频数据的解码和简单的显示,解码完一帧图像就显示,然后立即再解码下一帧并显示,相当于一个视频以XN倍的快进播放完。现在尝试对视频图像做时间同步,即按正常的视频速率播放。
DTS和PTS
首先有两个概念:DTS和PTS。一个是解码时间,一个是显示时间。对视频的编码,并不是一个帧就包含该帧的所有数据。简单地理解就是,很多时候,前后两帧视频图像之间的差别并不大,若两个帧用用完整的图像数据进行编码,相当于浪费了空间。因此,有些帧的数据只是对前一帧的的差值,这个帧需要参考前一帧的数据才能正确地解码出图像。然后,有些格式的帧,不仅要参考前面的帧,还要参考后面的帧,这样,在这一帧解码时,需要后面的帧先解码。这样就有了解码时间和显示时间。
ffmpeg中与时间有关的结构
AVPacket
、AVFrame
、AVCodecContext
和AVStream
中与时间相关的成员
-
AVPacket
:int64_t pts; int64_t dts; int64_t duration; int64_t pos;
pts
、dts
和duration
都是以AVStream->time_base
为单位。对pts
和dts
,如果文件是没有存储这个时间的话,其值将是AV_NOPTS_VALUE
。对duration