PS和TS本质上都是封装那么是什么是封装?TS和PS又分别是什么哪?
目录
MPEG-2
封装
- 将视频和音频文件打包到一起,遵循一定的规则和顺序建立排序和索引,便于播放器进行播放。
- 对封装来说,最重要的是音视频同步信息的维持
- flv、ts、ps、mp4、AVI、RTP
- 从使用范围来看, MP4主要适用于文件的存储。 TS、RTP适用于数据流的传输,不具有存储属性。PS既有存储属性又可以做实时流的传输。
- 流程:
- 首先有编码好的音视频数据(ES)
- 根据想要封装好的格式选择合适的封装器
- 利用封装器进行封装
- ES(elementary stream):基本码流,是编码后的音频和视频数据
- PES(packet elementary stream):将ES根据需要分割成长度不同的数据包,再加上包头得到PES
- 这一步将一个连续的长流分割成短流,便于在网络中分组发送
- DVD和DVB
- DVD(digital video disk)数字视频光盘(PS)
- DVB(digital video broadcast)数字视频广播(TS)
PS
- PS(program stream):节目流
- PS流有一个结束码
MPEG_program_end_code
:占位32bit,其值为0x000001B9
,PS流总是以0x000001BA
开始,以0x000001B9
结束,对于一个PS文件,有且只有一个结束码0x000001B9
,不过对于网传的PS流,则应该是没有结束码的;
TS
- 前面在RTMP、FLV、HLS那篇文章中提到了HLS中数据的封装格式为ts
- TS在拉流端(HLS在拉流端)
- TS(transport stream):传送流
- 将不同的PES根据共同或者独立的时间基准组合成一个TS流(用于数据传输)
- 将ES分割之后打包得到PES
- PES复合得到TS流
- TS是位流格式,可以按位存取
- TS包:188字节
- 一个TS包中有多个PES
- ES首先根据内容分割成长度不同的小段,然后给这些小段加上header就得到了PES
- PES复用得到TS包(188字节)
- PES头中加入PTS(显示时间标签)和DTS(解码时间标签)用于时钟同步
- TS包:包头、负载
- packet header
-
信息 位数 解释 1 syn_data 8 bits 同步字节 2 transport_error_indicator 1 bit 错误信息(1:该包至少有一位传输错误) 3 payload_unit_start_indicator 1 bit 负载单元开始标志 4 transport_priority 1 bit 传输优先级(1表示优先级高) 5 PID 13 bit 唯一标示一个TS包(有些特定类型的字段拥有特定的PID) 6 transport_scrambling_control 2 bits 是否加密(00表示未加密,其余表示加密) 7 adaptation_field_control 2 bits 附加区域控制 8 continuity_counter 4 bits 包增加计数 -
PID决定packet中的数据类型(PAT、视频、音频)
-
表 PID PAT 0x0000 CAT 0x0001 TSDT 0x0002 EIT,ST 0x0012 RST,ST 0x0013 TDT,TOT,ST 0x0014 - 当看到一个PID的时候我们可以判断出其数据类型,每个PID又唯一表示一个数据包
-
-
实例
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
…
Packet(十六进制)
4
7
0
7
e
5
1
2
…
Packet(二进制)
0
1
0
0
0
1
1
1
0
0
0
0
0
1
1
1
1
1
1
0
0
1
0
1
0
0
0
1
0
0
1
0
…
Packet Header 信息
1 sync_byte=0x47
2
3
4
5 PID=0x07e5
6
7
8
…
sync_byte=01000111, 就是0x47,这是DVB TS规定的同步字节,固定是0x47.
transport_error_indicator=0, 表示当前包没有发生传输错误.
payload_unit_start_indicator=0, 含义参考ISO13818-1标准文档
transport_priority=0, 表示当前包是低优先级.
PID=00111 11100101即0x07e5, Video PID
transport_scrambling_control=00, 表示节目没有加密
adaptation_field_control=01 即0x01,具体含义请参考ISO13818-1
continuity_counte=0010 即0x02,表示当前传送的相同类型的包是第3个
-
-
-
负载
-
-
TS:包头、填充字节、PES
-
-
PAT和PMT
-
-
PSI(program specific information):节目特定信息,用于传输流的多路分解和节目成功再现的标准信息,在TS流中是一个包
-
PAT、PMT、CAT、TSDT、NIT、IPMP控制信息表
-
-
PES中的内容可以是PAT也可以是PMT或者音视频数据
-
PAT
-
PAT(program association table)节目关联表,定义了当前TS流的所有节目,包含了节目的编号、节目对应的PMT的PID以及NIT(网络信息表)的PID,也就是说根据PID可以知道TS流中有哪些节目,以及节目所对应的具体信息(根据PMT找到节目元)和网络状况信息
-
PID为0x0000,当播放器对TS流进行检索分析的时候,首先找到PID为0x0000的包进行分析
-
-
所有的TS流的解析都是从寻找PAT表开始的,只有找到了PAT表,我们才能继续下一步的解析。
-
-
PMT(program map table):节目所对应的节目元的信息
-
包含这个节目的视频和音频信息
-
-
NIT(network information table):多组传输流和传输网络相关的信息
-
PCR(program conference reference):节目时钟参考,用于恢复出和编码端相同的系统时序时钟
-
- TS中的节目
- 节目的单位是节目元,节目元可以是基本流
- TS流含有独立时基的一个或多个program, 一个program又可以包含多个视频、音频、和文字信息的ES流; 每个ES流会有不同的PID标示. 而又为了可以分析这些ES流, TS有一些固定的PID用来间隔发送program和ES流信息的表格: PAT和PMT表。适用于误码较多的环境。
- 解码过程
- 获取TS的PAT,根据PAT得到PMT的位置
- 获得PMT,根据PMT得到当前网络中传输的音视频的格式(H264),相应的PID和PCR(时钟同步信号)
- 找到相应的TS包,以及其payload,这样就能得到PES
- 拼帧:在TS header中有一些关于此 payload属于哪个 PES的 第多少个数据包。 因此软件中应该将此payload中的数据copy到PES的buffer中,用于拼接一个PES包。
- 拼接好的PES去掉PES header就是ES
- I帧、P帧、B帧在ES中
- ES进行解码,然后利用PES中的PTS(显示时间标签)和DTS(解码时间标签)进行音视频同步得到音视频数据。
- 编码过程
- ES:I帧、P帧、B帧编码后的数据(H264)就组成了ES
- 流:视频编码流或音频编码流
- 每个ES只包含一种数据,比如音频或者视频
- ES的单元:AU
- AU:视频AU或者音频AU
- AU:头部和编码数据
- AU:一帧图像
- PES
- 分割的形式
- ES分割成长度可变的数据包,加入同步信息(PTS和DTS)然后打包得到PES
- B:PTS和DTS相同
- I和P:PTS和DTS不同,经过复用之后数据包的顺序被打乱,显示前需要将这个两个信息存储于从新排序缓冲中,经过重新排序时,用这两个信息作为排序的依据
- 打包后的PES也只含有一种数据
- TS
- PES包在复用之后得到TS
- 流
- ES:I帧、P帧、B帧编码后的数据(H264)就组成了ES
比较
- TS流可以在不稳定环境中传输,而PS必须在稳定环境中传输,为什么
- TS流是固定长度的流,其长度固定为188字节,而PS流的包是可变长度的
- 当传输误码破坏了TS的同步信息时,接收机可以在固定的位置检查其后面信息的同步信息,从而恢复同步,避免信息的丢失
- 当传输误码破坏了PS的同步信息时,由于PS包的长度是可变的。接受机无法找到特定的位置检查到同步信息,从而造成同步信息丢失,造成很严重的后果
- 因此,需要在稳定环境(传输误码率低)中传输PS流
- 目前在MPEG-2中采用TS流