您现在的位置是:首页 > 数码 > 

封装格式

2025-07-27 01:54:36
封装格式 TS 基础知识TS packet的大小TS封装过程PES packet内部结构关键栏位 TS packet内部结构关键栏位 PSI/SIPAT内部结构图关键栏位 PMT内部结构关键栏位 实际应用遇到的问题 基础知识 ES流(Elementary Stream): 基本码流,不分段的音频、视频或其它信息的连续码流。PES流(Packet

封装格式

TS
  • 基础知识
  • TS packet的大小
  • TS封装过程
  • PES packet
    • 内部结构
    • 关键栏位
  • TS packet
    • 内部结构
    • 关键栏位
  • PSI/SI
    • PAT
      • 内部结构图
      • 关键栏位
    • PMT
      • 内部结构
      • 关键栏位
  • 实际应用遇到的问题


基础知识

  • ES流(Elementary Stream):
    基本码流,不分段的音频、视频或其它信息的连续码流。
  • PES流(Packeted Elementary Stream):
    打包的基本码流,把基本码流(ES)分割成段,并加上头部信息打包而成。
  • PS流(Program Stream):
    节目流,将具有共同时间基准的一个或多个PES复合并打包而成的单一数据流。PS包的长度不固定。
  • TS流(Transport Stream):
    传输流,将具有共同时间基准或独立时间基准的一个或多个PES复合而成的单一数据流。TS包的长度固定。
注意:
TS流抵抗传输误码能力强于PS流,因为TS packet是固定长度的.
如果某一TS packet的同步信息被破坏,接收机可在固定位置(ts packet length)检测它后面packet的同步位置,从而恢复同步。
而PS流无法确定下一个PS packet的同步位置,从而造成失步。

TS packet的大小

TS Packet有四种大小:

  • 188 bytes:MPEG-2标准大小
  • 192 bytes:188 bytes  4 bytes时间码 --> 日本DVH-S标准
  • 204 bytes:188 bytes  16 bytes前向纠错码(FEC) --> 美国ATSC标准
  • 208 bytes:188 bytes  4 bytes时间码  16 bytes前向纠错码(FEC)

TS封装过程

ES封装成TS需要经过两次封装。如下图:

注意:

  • 如果一个pes packet打包为多个ts packet,那么同一个pes的ts packet是排在一起的
  • sps和pps的nalu通常是跟I frame nalu封在同一个pes packet里面的。也就是:

PES packet

内部结构

关键栏位

  • Packet start code prefix:
    –>包头起始码,固定为0x00 00 01,占位24bit,用来作为pes packet的分割符。
  • Stream id:
    –>PES包中的负载流类型,比如音频流:0xC0 ~ 0xDF,视频流是: 0xE0 ~ 0xEF。一般音频是0xC0,视频是0xE0
    注意:packet start code prefix  stream id这四个字节称为pes start code(PES起始码),用以识别pes packet的开始,共4个字节。
    音频start code为:0x 00 00 01 C0视频start code为:0x 00 00 01 E0
  • PES packet length:
    –>PES包长度,包括此字节后的可选包头和负载的长度,占位16bit,所以PES包的最大负载长度为6555bytes,如果一帧数据超过6555,那么就会被分为多个PES。该栏位可以为0,表示pes packet是任意长度的,只有es data是video的情况下才允许设置为0
    PES packet length = (2 bytes flag  1 byte pes header length)  pes header data length    bytes payload
    -->
    (payload size) = PES packet length - pes header data length - 
    pes header data length只有一字节,所以最多255字节。
    
  • PTS/DTS flag:
    –>PTS和DTS标志位,占位2bit。10b:有PTS字段;11b:有PTS和DTS字段;00b:都没有。
    1> PTS/DTS flag = 10b

    2> PTS/DTS flag = 11b

    需要注意这里pts和dts的单位是timescale,因为ts在进行封装时的参考时钟频率是90KHz,那么1 timescale = 1/90 000 s = 1/90ms,所以dts/pts转换为毫秒的话,需要乘以1/90,即 pts/90 ms,dts/90 ms

TS packet

内部结构

关键栏位

  • Sync byte:
    –>同步字节。固定为0x47
  • Transport error indicator:
    –>传输错误指示位。
    1: packet中至少有一个不可纠正的错误位;
    0: 无错误位。
  • Payload unit start indicator:
    –>负载单元起始指示位。(重要!)
    1: 该packet为PES或PSI的第一个ts包;
    0: 不是。
    如果是PSI包,那么payload的第一个字节为pointor field,所以PSI的有效字节从payload第二个字节开始。
  • Transport priority:
    –>传输优先级,表明在同个PID的packet中,该packet优先级更高。(比如说I frame packet?)
  • PID :
    –>packet的ID号。
  • Transport scrambling control :
    –>传输加扰控制位,指示packet有效净载的加扰方法。

    注意:以上加扰的类型为DVB-CSA和ATSC DES。
  • Adaptation field control :
    –>自适应调整域控制位,一般是PCR相关的信息。
  • Coutinuity counter :
    –>连续计数器。随着具有相同PID的packet增加而增加,最大为15,达到最大重置为0。
    如果两个连续相同PID packet具有相同的计数,则表明两个包是一样的,应将其丢弃
  • Adaptation field length:
    –>自适应调整域的长度。

PSI/SI

  • PSI
    Program Specific Information, 节目引导信息,在MPEG-2标准中定义的。
  • SI
    Service Information, 业务信息,在DVB标准中定义的。
  • 常见的有:

PAT

Program Association Table,节目关联表,是接收数据的入口点,解析TS的起点。

内部结构图

关键栏位
  • table id:
    –> 对于PAT来说,table id固定是0x00。
  • Section syntax indicator:
    –>对于PAT来说,置为’1’
  • Section length:
    –>分段长度。表示从section length(包括在内)到CRC_2字段的字节数,不超过1021。前面两位固定为’00’
  • Transport stream id:
    –>传输流标识号。用来表示来源于网络中任何其它复合流的TS流。
  • Version number:
    –>PAT版本号,如果PAT有变,则版本号加1
  • Current next indicator:
    –>1,当前表有效;0,当前表无效,下一个表才有效。
  • Section number:
    –>分段号。表示当前packet属于PAT的第几个分段,第一个分段为0x00。
  • Last section number:
    –>PAT最后一个分段号。
  • Program number:
    –>节目编号。
  • etwork pid:
    –>IT表的PID。
  • Program map pid:
    –>PMT 的PID值。据此出响应的PMT表。

PMT

Program Map Table,节目映射表。连接节目号和节目元素的桥梁。

内部结构

关键栏位
  • Table ID:
    –>由PAT确定。
  • Version number:
    –>PMT版本号,如果PMT有变,则版本号加1
  • PCR_PID:
    –>包含PCR信息的packet PID。
  • Program info length:
    –>节目信息长度。紧跟在其后的就是节目信息。
  • Stream type:
    –>节目流编解码类型。
    MPEG-2是0x02H264一般是0x1bAAC是0x0fH265是0x24
    具体如下图:
  • Elementary PID:
    –>基本码流的PID。
  • Es info length:
    –>前两个字节为’00’,紧跟其后的就是基本码流信息。

实际应用遇到的问题

  1. 一个PES packet只有一帧?
    –>
    不是的,因为一个PES packet最大长度时6555,所以如果一帧大于6555的话,将会被分为几个pes packet。

  2. 如何从ts packet解析出一个完整的pes packet?
    –>
    首先对于一系列ts packet,判断其header中payload_unit_start_indicator flag,如果是1;
    再判断ts payload,看看其前三个字节是不是0x 00 00 01,
    如果都满足的话,那说明是pes开头。从这个ts packet开始将payload放到 pes buffer中。

  3. 如何区分audio pes packet和video pes packet?
    –>
    a. 从PMT中可以parse出audio packet pid和video packet pid,从而可以区分出audio ts packet和video ts packet,解封装出来的pes packet类型自然可以知道。
    b. 看pes packet start code,start code 为0x 00 00 01 C0,那就是audio pes packet;start code为0x 00 00 01 E0,那就是video pes packet。

  4. 如何获得duration?
    –>
    1> 从Downloader获取duration(有的网络协议里面会带有duration信息,比如rtsp)
    2> 分别获取第一个video pes packet和最后一个audio pes packet的pts,相减后得到duration。
    > 根据码流比特率和文件大小计算duration。
    4>获取码流最后一个PVR time code,经过单位换算后得到duration。

  5. 网络播放中,如何获得ts的duration?
    –>
    Player首先从range为0发起一次请求,从响应报文中识别出content-length字段,得到ts文件大小filesize,并解析出PAT、PMT和第一个video pts,
    然后关闭http连接,再发起一次请求,range = filesize - 4096,从服务器返回的数据中解析最后一个video pes packet的pts,
    如果没有到video pts,就以range=filesize - 4096 * n (n =1, , 6, 10, 15 … ) 继续请求,
    直到parse到最后一个video pts为止,然后duration就是最后一个video pts减去第一个video pts。

  6. 对于TS,为什么ES要经过两次封包?
    –>
    ES–>PES:对ES进行打包和加入包头信息等操作,为码流复合做准备。
    PES–>TS:将音频视频和其它数据进行复合,并打包为固定大小的packet,在丢包之后,能够及时纠正并同步,使之具有很强的抵抗传输误码的能力。

  7. 如何probe一个文件为TS文件?
    –>
    数据流开头2048字节中出现0x47与0x47之间的间隔为{188, 192, 204, 208}之一,并且连续出现8次,则说明该码流是TS。

  8. 如何知道当前码流中的audio和video的codec type?
    通过parse audio 和video descriptor tag的stream type filed,在DVB标准中,H264一般是0x1b,adts AAC是0x0f,H265是0x24。
    (player完全信任该filed,如果码流标错的话,就gg)

  9. PES header中start code prefix为0x 00 00 01,跟H.264流中的start code prefix相同,如何区分?
    –>
    通过ts packet的负载起始标志位(Payload unit start indicator)来识别出pes packet的第一个ts packet,而PES Header一定在第一个ts packet中。
    还有就是stream id的的最高位是1,而h264 header的最高位是0,通过这点也可以将二者分辨出来。

  10. 怎么获得ts码率?
    –> (reverse…)

  11. 怎么做seek?
    –> (reverse…)

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/707578.html

相关标签:无
上传时间: 2023-11-21 23:39:24
留言与评论(共有 14 条评论)
本站网友 来宾酒店
12分钟前 发表
15 … ) 继续请求, 直到parse到最后一个video pts为止,然后duration就是最后一个video pts减去第一个video pts
本站网友 化石合剂
28分钟前 发表
如何从ts packet解析出一个完整的pes packet? –> 首先对于一系列ts packet,判断其header中payload_unit_start_indicator flag,如果是1; 再判断ts payload,看看其前三个字节是不是0x 00 00 01, 如果都满足的话,那说明是pes开头
本站网友 汕头翠堤湾
26分钟前 发表
如何从ts packet解析出一个完整的pes packet? –> 首先对于一系列ts packet,判断其header中payload_unit_start_indicator flag,如果是1; 再判断ts payload,看看其前三个字节是不是0x 00 00 01, 如果都满足的话,那说明是pes开头
本站网友 底漆和面漆
19分钟前 发表
据此出响应的PMT表
本站网友 光子嫩肤优势
19分钟前 发表
–> 对于PAT来说,table id固定是0x00
本站网友 html滚动条
25分钟前 发表
TS包的长度固定
本站网友 指出
2分钟前 发表
PES packet length = (2 bytes flag  1 byte pes header length)  pes header data length  bytes payload --> (payload size) = PES packet length - pes header data length - pes header data length只有一字节,所以最多255字节
本站网友 定期存单提前支取
19分钟前 发表
192
本站网友 苏州男科医院
9分钟前 发表
PES–>TS:将音频视频和其它数据进行复合,并打包为固定大小的packet,在丢包之后,能够及时纠正并同步,使之具有很强的抵抗传输误码的能力
本站网友 斯莱特林
6分钟前 发表
如何知道当前码流中的audio和video的codec type? 通过parse audio 和video descriptor tag的stream type filed,在DVB标准中,H264一般是0x1b,adts AAC是0x0f,H265是0x24
本站网友 女人行
17分钟前 发表
如何获得duration? –> 1> 从Downloader获取duration(有的网络协议里面会带有duration信息,比如rtsp) 2> 分别获取第一个video pes packet和最后一个audio pes packet的pts,相减后得到duration
本站网友 激光祛斑的危害与效果
30分钟前 发表
那音频start code为:0x 00 00 01 C0,视频start code为:0x 00 00 01 E0PES packet length: –>PES包长度,包括此字节后的可选包头和负载的长度,占位16bit,所以PES包的最大负载长度为6555bytes,如果一帧数据超过6555,那么就会被分为多个PES
本站网友 breakingnews
13分钟前 发表
–>基本码流的PID