0 errors, 0 warnings

FPGA应用;视频图像处理

TS流(5)——PCR,PTS

0
阅读(2608)

    在前面的文章中,我们了解了各种类型的包。现在我们要讨论的就是TS包中的一些关键信息——PCR,PTS,DTS,VBV。主要关系到系统时钟恢复以及视/音频同步。

    PCR:Program Clock Reference,为节目时钟参考,存在于TS头信息。用于恢复出与编码端一致的系统时序时钟STC(System Time Clock).

    PTS/DTS: PTS(Presentation Time Samp),为显示时间戳,用于控制解码后图像的显示时间(顺序)。                                DTS(Decoding Time Stamp),为解码时间戳,用于控制码流被解码器解码的时间(顺序)。两者都存在于PES包头信息。

    VBV:Video Buffer Verifier,为视频缓冲验证。用以防止解码器的缓冲器出现上溢或下溢的情况。

    又由于我们设计的TS流主要用于传输我们的264编码器所产生的264码流。该264码流无VBV信息,所以这里我们将不研究VBV信息。且该264码流只包含I帧、P帧,不包含B帧。因此图像的解码顺序与显示顺序是一样的。这种情况下DTS等同于PTS,可以只设置PTS值。

    接下来,我将对PCR以及PTS给出更为详细的说明。


1,PCR

   PCR信息既可以独立作为一个包,即设置PCR_PID为一个独立的值。也可以放到PES包中,即设置PCR_PID等于PES包的PID。

    PCR包含2部分——33位的PCR_base以及9位的PCR_ext。共同构成42位的PCR。

    其中,PCR_ext的作用在于修正解码器的STC(系统时钟),使其达到和编码器一致的27M。从而同步头端和终端色度平衡以及帧率。在数字电视的终端设备上,都有一个压控振荡器和一个内部计数器。这个内部计数器会对本地压控振荡器的时钟进行计数,并且和TS流传输过来的PCR数字进行比较。若本地计数器的变化率高于PCR的变化率,表示本地的27M时钟比头端的27M时钟快,则调整压控振荡器的电压,降低压控振荡器的频率;反之则提高本地振荡器的振荡频率。

    PCR_base的主要作用在于与PTS和DTS作比较,即当PTS或DTS等于PCR_base时,相应的单元被显示或解码。另外,在解码器切换节目时,PCR_base也提供对解码器PCR计数器的初始值。

    下面给出PCR值的相关计算:

    PCR_ext的计数时钟为STC(27M),PCR_base的计数时钟为STC的1/300,即90KHZ。如时间“03:02:29.012”=(3*60+2)*60+29.012=10949.012s

    则PCR_base=((27 000 000*10949.012)/300)%(2^33)=98 541 080

    PCR_ext=((27 000 000*10949.012)/1)%(300)=0

    PCR=PCR_base*300+PCR_ext.

    需要注意的是,PCR信息间隔不能超过0.1s且PCR字段的值应该为PCR字段最后一个字节被发送时的即时值。


2,PTS

  在264码流中,除了I帧、P帧外,还有可能存在B帧。由于B帧在其前后都有其参考帧,就导致在包含B帧的码流中,图像的解码顺序可能和显示顺序不同,如下图:

    image.png

    因此PTS/DTS可以控制图像的解码及显示顺序。另外,图像的播放会涉及到帧率的问题,而PTS可以控制图像显示的时间点,进而控制图像的播放帧率。

    在本设计中,我们所传输的264数据不包括B帧,因此只需要设置PTS的数值。假设视频的帧率为25帧每秒,即每隔40ms播放一帧。则PTS的递增值为40*90。注意:PTS的时间间隔应不超过0.1s。

    PTS信息一般在包含有PES包起始部分的TS包中给出。