天天看点

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

相关文章:

视频解码研究之PTS(1)TS格式和FLV格式

视频解码研究之PTS(2)Mp4格式,AVI格式和MKV格式

MKV格式的PTS解析代码

FLV格式的解复用和PTS分析代码

    今天来讨论下PTS,这片东西涉及的方面比较多,许多结论我也是从大胆推测的,有什么不对的,希望大家帮我指出来。

    PTS是presentation time stamp的缩写,简单说就是播放时间戳。ffmpeg中音视频的同步是通过PTS完成的,而PTS是怎样从码流中解析出来的呢?

    其实不同的多媒体文件格式有不同获取方式。

1.TS流的PTS:

    这可以说是PTS的出处。PTS是在mpeg-1,2编解码的体系中首先提出的概念,见于文档ISO/IEC 13818-1。该文档描述了TS(transport stream)流和PS(program stream)流的格式和应用。这两种格式都由PES packet组成。

    PTS用于标定某帧图像的播放时间,出现在PES packet header中,占用33bits。

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

    PES packet的格式如上图所示,红框标注3处就是标识PTS的bits,从高位到低位共33bits。

Mpeg-2规定的系统时钟频率为27MHz,PTS就是以系统时钟的300分频为单位的计数值。

    所以PTS的单位换算成秒就是:

                                                   1 / ( 27M/300 ) = 1 / 90k.

    从某TS码流中得到播放顺序第0帧的PTS为0xB0C0697A,第一帧的PTS为0xB0C0778A

    两帧的PTS之差为

                                                  0xB0C0778A - 0xB0C0679A = 0xE10 = 3600

    则两帧图像的播放时间间隔为

                                                   3600 * ( 1/ 90k ) = 0.04s。

    正好是25帧每秒的视频的时间间隔。

    音频数据也有对应的PTS。

    TS流中还利用单独的pid传送了PCR,就是系统时钟的计数器,解码器可以从PCR中恢复出系统时钟STC,参照STC和PTS,就知道图像和音频什么时候播放,从而完成了音视频同步。

2.flv的PTS:

    首先引入dts(decode time-stamp)的概念,解码时间戳,标识数据送入解码器的时间,就是开始解码的时间,应该按时随着解码顺序而递增的。

    flv格式在码流里有time-stamp位,如图所示:

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

    由Timestamp和TimestampExtended组合得出TS(time-stamp),单位是毫秒。

    解码某flv文件按照解码顺序得出TS如图:

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

    可见TS是递增的,又知道此码流有B帧,所以播放顺序一定是和解码顺序不同的。所以flv中的TS应该是DTS。

    flv格式中的视频数据段还有一个composition time位,如下图:

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

    PTS应该等于TimeStamp + CompositionTime.

    根据此式,我写了段程序读入前面的flv文件得到下图结果:

视频解码研究之PTS(1)TS格式和FLV格式 续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式

    经检验和ffmpeg计算的DTS,PTS结果相同。

续篇见 视频解码研究之PTS(2)Mp4格式和AVI格式