概述
ES流(Elementary Stream) 基本码流,不分段的音频、视频或其他信息的连续码流。
PES流 把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。
PS流(Program Stream) 节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。
TS流(Transport Stream) 传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。
*NOTE: TS流和PS流的区别:TS流的包结构是长度是固定的;PS流的包结构是可变长度的。 这导致了 TS流的抵抗传输误码的能力强于PS流 (TS码流由于采用了固定长度的包结构, 当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。 而PS包由于长度是变化的,一旦某一 PS包的同步信息丢失, 接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。 因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。)
由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流的包格。
TS流生成流程图
从上图可以看出,视频ES和音频ES通过打包器和共同或独立的系统时间基准形成一个个PES, 通过TS复用器复用形成的传输流。 注意这里的TS流是 位流格式(分析Packet的时候会解释),也即是说TS流是可以按位读取的。
TS流的格式
TS流是基于Packet的位流格式,即由n个包组成;每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据)
包头
namebit位描述
sync_byte8 bits同步字节,固定是0x47transport_error_indicator1 bits错误指示信息(1:该包至少有1bits传输错误)payload_unit_start_indicator1 bits负载单元开始标志(packet不满188字节时需填充)transport_priority1 bits传输优先级标志(1:优先级高)PID13 bitsPacket ID号码,唯一的号码对应不同的包transport_scrambling_control2 bits加密标志(00:未加密;其他表示已加密)adaptation_field_control2 bits附加区域控制continuity_counter4 bits包递增计数器
TS流中PID的分配
TS流中PID的分配
表PID值
PAT0x0000CAT0x0001TSDT0x0002预留0x0003 至0x000FNIT ST0x0010SDT , BAT, ST0x0011EIT, ST0x0012RST, ST0x0013TDT, TOT, ST0x0014网络同步0x0015预留使用0x0016 至 0x001B带内信令0x001CDIT0x001ESIT0x001F
术语
业务与事件
PSI/SI表
如上图所示,现实情况下,举个例子,在上图位于Services,而比如CCTV1~CCTV14对应不同的components,
PAT 节目关联表 Program Association Tabl
PID为0x0000 ,TS码流解析从PAT表开始
PAT表携带以下信息
TS流IDtransport_stream_id该ID标志唯一的流ID
节目频道号program_number该号码标志TS流中的一个频道,该频道可以包含很多的节目(即可以包含多个Video PID和Audio PID)PMT的PIDprogram_map_PID表示本频道使用哪个PID做为PMT的PID。因为可以有很多的业务,因此DVB规定PMT的PID可以由用户自己定义
PAT数据包分为两个部分,一个是PAT数据包头部(前8个Byte),一个是循环部分
program_association_section()
{
unsigned table_id :
8;
unsigned section_syntax_indicator :
1;
unsigned ‘
0’ :
1;
unsigned reserved_1 :
2;
unsigned section_length :
12;
unsigned transport_stream_id :
16;
unsigned reserved_2 :
2;
unsigned version_number :
5;
unsigned current_next_indicator :
1;
unsigned section_number :
8;
unsigned last_section_number :
8;
for(i=
0;i<N;i++)
{
program_number :
16;
reserved :
3;
network_id 或 program_map_PID :
13;
}
CRC_32 :
32;
}
PMT 节目映射表 Program Map Table
1
(1) 当前频道中包含的所有Video数据的PID
(2) 当前频道中包含的所有Audio数据的PID
(3) 和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)
PMT 表头
TS_program_map_section() {
table_id :
8;
section_syntax_indicator :
1;
'0' :
1;
reserved :
2;
section_length :
12
program_number :
16
reserved :
2
version_number :
5
current_next_indicator :
1
section_number :
8
last_section_number :
8
reserved :
3
PCR_PID :
13
reserved :
4
program_info_length :
12
for (i =
0; i < N; i++) {
descriptor()
}
for (i =
0; i < N1; i++) {
stream_type :
8
reserved :
3
elementary_PID :
13
reserved :
4
ES_info_length :
12
for (i =
0; i < N2; i++) {
descriptor()
}
}
CRC_32 :
32
}