TS 流都是固定等长的188字节包
如下图所示 用UltraEdit打开的一个TS流,我们发现每隔188个字节就有一个47(可以看做是包头)
TS的包头占用四个字节
以第一个包为例:
47 60 00 10 00 00 B0 0D 00 00 C1 00 00 00 01 E0
81 0C 8C BE 32 FF FF ……………………………..
………………………………………………………
………………………………………………………
………………………………….FF
我们将其按照位进行划分 (0~31位,共4个字节 32位)
1. 0~7 位: 同步位置 第一个字节 如 十六进制 47 (01000111)
2. 8~10 位: 第9位是有效载荷单元起始符:(1表示起始符 0 表示后续数据) 一个TS包是188字节 而一帧数据远远大于188字节 所以一帧数据被拆分成多个TS包。
起始符为1 的表示该帧的第一个TS包 里面含有当前帧的描述信息 PTS(Presentation Time
Stamp)表示该帧数据的时间位置以及当前帧含有的数据量(TS包个数,大部分不描述
用0代替)
起始符为0的TS包 存放当前帧的剩余信息
只会出现三个十六进制数字之一: 0 4 6,其它说明包错误 如当前为 6
0: 二进制 0000 (有效载荷单元起始符 为0) 这里借用了PID一位
4: 二进制 0100 (有效载荷单元起始符 为1) 这里借用了PID一位
6: 二进制 0110 (有效载荷单元起始符 为1) 这里借用了PID一位
3. 11~23位:PID(packet ID) 是每个节目的唯一标识 如当前为 0 0 0 (第一个包为 000)(除了pid=000 标识第一个包 其它数字都是随机可选的 无须按某种序列排序)
4. 24~27位:四位刚好可以用一个16进制数字标识 这里表示其负载类型 (其存放有效数据) 当前为1 表示负载中只有有效载荷
0:保留值,供未来使用 (碰到丢弃即可)
1:负载中只有有效载荷
2:负载中只有自适应字段
3:先有自适应字段,再有有效载荷
自适应字段长度, 占一个字节
自适应字段内容,占得字节由长度自适应字段长度决定,多余的字节用0xFF填充
5.28~31位:无须考虑 直接跳过 简单理解为相同PID的顺序码
PES (Packetized Elementary Stream) 打包的元流 简单说一个个PES包去掉PES包头剩下的就是一帧帧的数据
有效载荷单元起始符 为1 的TS包会含有部分PES包头