封装格式
封装格式
- 基础知识
- 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是0x02,H264一般是0x1b,AAC是0x0f,H265是0x24。
具体如下图:
- Elementary PID:
–>基本码流的PID。 - Es info length:
–>前两个字节为’00’,紧跟其后的就是基本码流信息。
实际应用遇到的问题
-
一个PES packet只有一帧?
–>
不是的,因为一个PES packet最大长度时6555,所以如果一帧大于6555的话,将会被分为几个pes packet。 -
如何从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中。 -
如何区分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。 -
如何获得duration?
–>
1> 从Downloader获取duration(有的网络协议里面会带有duration信息,比如rtsp)
2> 分别获取第一个video pes packet和最后一个audio pes packet的pts,相减后得到duration。
> 根据码流比特率和文件大小计算duration。
4>获取码流最后一个PVR time code,经过单位换算后得到duration。 -
网络播放中,如何获得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。 -
对于TS,为什么ES要经过两次封包?
–>
ES–>PES:对ES进行打包和加入包头信息等操作,为码流复合做准备。
PES–>TS:将音频视频和其它数据进行复合,并打包为固定大小的packet,在丢包之后,能够及时纠正并同步,使之具有很强的抵抗传输误码的能力。 -
如何probe一个文件为TS文件?
–>
数据流开头2048字节中出现0x47与0x47之间的间隔为{188, 192, 204, 208}之一,并且连续出现8次,则说明该码流是TS。 -
如何知道当前码流中的audio和video的codec type?
通过parse audio 和video descriptor tag的stream type filed,在DVB标准中,H264一般是0x1b,adts AAC是0x0f,H265是0x24。
(player完全信任该filed,如果码流标错的话,就gg) -
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,通过这点也可以将二者分辨出来。 -
怎么获得ts码率?
–> (reverse…) -
怎么做seek?
–> (reverse…)
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:python编写会计凭证金蝶
下一篇:调研分析
推荐阅读
留言与评论(共有 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 |