TS码流解析(三)PES

我们常说的音视频数据流在TS中被称为Elementary Stream(ES),也称为原始码流(裸流)。ES流本身不含有传输所需的所有信息,为了在传输过程中同时携带PTS(Presentation Time Stamp,显示时间戳)、DTS(Decoding Time Stamp,解码时间戳)等信息,会将ES流加上一个Header,封装成PES(Packet Elementary Stream)包。

1、PES包的接收

PES包往往比较长,所以需要分段传输,这样会有一个问题,接收了多个TS包后我们如何知道哪一包TS是PES的开头,哪一包又是PES的结尾?

TS header中有一个负载开始指示符(payload_unit_start_indicator,PUSI),表示当前TS包的负载是否属于新的一帧:

  • PUSI为0,说明当前的PES包还未接收完成,负载属于当前PES包中的一部分内容,我们需要把这包的负载拼接到之前接收的负载之后;
  • PUSI为1,说明前面一个PES包已经接收完成,当前接收的负载属于一个新的PES包,这时候我们可以来解析前面一个PES包,可以理解为,只有在后面一个PES包到达时我们才能知道前面一个PES包接收完成了。

这里有一点要说明,大多数情况下可以认为一个PES包就是一帧数据,对应着一个PTS和一个DTS,但是也有特殊的情况,一帧数据可能会跨多个PES包。

此外,TS包头中还有一个continuity_counter字段

posted @ 2024-04-26 22:24  青山渺渺  阅读(21)  评论(0编辑  收藏  举报  来源