引言
标准文档给自己的定义是:论述了将音频和视频的一个或多个基本流以及其他数据组合成为一个单独的流或多个流,以适于存储或传输。系统编码遵循本规范中提出的句法和语义规则,并且提供信息使得解码器缓冲区可以在各种检索或接收条件下进行同步解码。
节目流:它是由一个或多个具有共同时间基的PES 包的流组合成一个单独的流而形成的。
传输流:是将具有一个或多个独立时间基的一个或多个节目组合成为一个单独的流。由组成一个节目的基本流所构成的PES包共享一个公共的时间基。传输流被设计为在易于出错的环境中使用,例如在有损的或嘈杂的媒体中进行存储或传输。传输流的包长度为188 个字节。
引言1 传输流
传输流是一种流定义,适用于在一个可能发生较多错误的环境中传输或存储由遵循ITU-T H.262 建议书 | ISO/IEC 13818-2 和ISO/IEC 13818-3 的编码数据以及其他数据所形成的一个或多个节目。
传输流可能具有固定速率或可变速率;传输流的速率由节目时钟基准(PCR)字段的取值和位置来定义,一般来说对于每种节目都有一个独立的PCR 字段。
引言2 节目流
节目流是一种流定义,适用于在一个不太可能发生误差的环境中传输或存储由编码数据或其他数据所形成的一个节目,在这种情况下,对系统编码的处理,如通过软件进行处理,是一个主要的考虑方面。
节目流可能具有固定速率或可变速率,节目流的速率由系统时钟基准(SCR)字段和复用速率(mux_rate)字段的取值和位置来定义。
引言4 PES
每个传输流和节目流在逻辑上都是由PES 包构造的
属于一个基本流的、具有同一个流ID 的、连续的PES 包序列可能被用于构造一个PES 流
当PES 包被用于构造一个PES 流时,它们必须包含基本流时钟基(ESCR)字段和基本流速率(ES_Rate)字段
引言5 time mode
所有的时序都根据一种公共系统时钟来定义,该时钟被称为一个系统时钟。
在节目流中,此时钟可能与视频或音频采样时钟之间具有一个精确指定的比率,或者其运行频率可能与精确的比率之间有轻微的不同,但仍然能够提供精确的端到端的时序和时钟恢复。
在传输流中,系统时钟频率被限定为在任何时候都应与音频和视频采样时钟之间具有精确指定的比率;此限定的目的是为了简化解码器处的采样速率恢复。
重要的定义
- Elementary Stream Clock Reference; ESCR (system) 基本流时钟参考
- presentation time-stamp; PTS (system) 显示时间标记;PTS(系统):PES 包头中可以存在的、指示系统目标解码器中显示单元的显示时间的一个字段。
- Program Clock Reference; PCR (system) 节目时钟参考;PCR(系统):从传输流中时间标记推导而来的解码器计时。
- Program Specific Information; PSI (system) 节目特定信息;PSI(系统):PSI 由对于传输流的多路分解以及节目成功再现所必要的标准数据组成,并在2.4.4 中描述。专门规定的PSI 数据实例是非必备网络信息表。
- System Clock Reference; SCR (system) 系统时钟参考;SCR(系统):从节目流中时间标记推导而来的解码器计时。
- system target decoder; STD (system) 系统目标解码器;STD(系统):用于确定ITU-TH.222.0 建议书| ISO/IEC 13818-1 多路复用比特流语义的解码过程的虚拟参考模型。
系统时钟频率
系统时钟频率值以Hz 为度量单位且必须满足以下限制:
27 000 000 – 810 ≤ system_clock_frequency ≤ 27 000 000 + 810
system_clock_frequency 的速率变化,每次≤75×10−3 Hz/s
PCR计算
PCR(i) = PCR _ base(i)× 300 + PCR _ ext(i)
PCR_base(i) = ((system_clock_frequency × t(i)) / 300) %2^33
PCR_ext(i) = ((system_clock_frequency × t(i)) / 1)%300
PCR_base:以1/300 的系统时钟频率周期为单位,称之为program_clock_reference_base
PCR-base的作用:
a. 与PTS和DTS作比较, 当二者相同时, 相应的单元被显示或者解码.
b. 在解码器切换节目时,提供对解码器PCR计数器的初始值,以让该PCR值与PTS、DTS最大可能地达到相同的时间起点.
PCR_ext:以系统时钟频率为单位,称之为program_clock_reference_extension
PCR-ext的作用:
通过解码器端的锁相环路修正解码器的系统时钟, 使其达到和编码器一致的27MHz.
例如:
时间"03:02:29.012"的PCR计算如下:
03:02:29.012=((3*60+2)*60)+29.012=10949.012s
PCR_base = ((27000000 × 10949.012) / 300) %2^33 = 98541080
PCR_ext = ((27000000 × 10949.012)/ 1) % 300 = 0
PCR = 98541080 * 300 + 0 = 295623324000
语法
首先看前辈们整理出来的一张图:
一个TS数据包
47 41 00 30 07 50 00 00 80 F7 7E 00 00 00 01 E0 00 00 80 80 05 21 00
07 F0 0D 00 00 00 01 09 10 00 00 00 01 67 4D 40 33 95 A0 0F 00 10 FB
01 40 80 00 01 F4 80 00 75 30 70 00 00 0F 42 40 00 00 F4 24 0D DE 5C
1F 1C 32 A0 00 00 00 01 68 EE 3C 80 00 00 00 01 06 00 07 81 19 40 00
46 50 40 80 00 00 00 01 06 01 04 00 00 08 10 80 00 00 00 01 65 B8 04
04 1F 02 EB 03 FE 13 F0 D4 6D 2C 00 D1 DF 2D C0 00 00 03 00 00 03
00 00 03 00 00 03 00 00 2F 3D 76 1F D0 53 29 EE 83 00 00 03 00 00 03
00 00 03 00 00 03 00 04 30 04 00 00 03 00 00 03 00 00 05 EC 00 00 03
00 00 03 00 00
包头
//包头数据
47 41 00 30
0100 0111 0100 0001 0000 0000 0011 0000
sync_byte - 8bit - 0x47
- sync_byte 为固定的8 比特字段,其值为'0100 0111' (0x47)。在对于其他正式出现字段的赋值选择中,诸如PID,应避免sync_byte 仿真
**transport_error_indicator - 1bit - 0 **
- 置于1 时,它指示在相关传输流包中至少存在1 个不可校正比特错。此比特可以由传输层以外的实体设置为‘1’。设置为‘1’时,此比特应不重新设置为‘0’,除非误差比特值已经校正。
payload_unit_start_indicator - 1bit - 1
- 对于承载PES包或PSI数据的传输流包,它具有标准含义。
- 当传输流包有效载荷包含PES包数据时,payload_unit_start_indicator 具有以下意义:‘1’指示此传输流包的有效载荷应随着PES 包的首字节开始,‘0’指示在此传输流包中无任何PES包将开始。若payload_unit_start_indicator 设置为‘1’,则一个且仅有一个PES 包在此传输流包中起始。这也适用于stream_type 6 的专用流;
- 当传输流包有效载荷包含PSI 数据时,payload_unit_start_indicator 具有以下意义:若传输流包承载PSI分段的首字节,则payload_unit_start_indicator 值必为1,指示此传输流包的有效载荷的首字节承载pointer_field。若传输流包不承载PSI 分段的首字节,则payload_unit_start_indicator 值必为‘0’,指示在此有效载荷中不存在pointer_field。参阅2.4.4.1 和2.4.4.2。这也适用于stream_type 5 的专用流;
- 对空包而言,payload_unit_start_indicator 必须设置为‘0’。
transport_priority - 1bit - 0
- 设置为‘1’时,它指示该相关包比具有相同PID 但不具有该比特设置为1 的其他包有更大的优先级。传输机制可以使用该字段优先考虑基本流内的该包数据。取决于应用,transport_priority 字段可以不管PID 或者此字段仅在一个PID 范围内编码。此字段可以由信道特定编码器或解码器来改变。
PID - 13bit - 0 0001 0000 0000
-
PID 为13 比特字段,指示包有效载荷中存储的数据类型。
transport_scrambling_control - 2bit - 00
- 此2 比特字段指示传输流包有效载荷的加扰方式。
- 传输流包头以及自适应字段若存在,应不加扰。
-
在空包的情况中,transport_scrambling_control 字段的值应设置为“00”
adaptation_field_control - 2bit - 11
-
此2 比特字段指示此传输流包头是否后随自适应字段和/或有效载荷
- 解码器应丢弃具有adaptation_field_control 字段设置为‘00’值
的传输流包。 - 在空包的情况中,adaptation_field_control 的赋值应为‘01’。
**continuity_counter - 4bit - 0000 **
- 随着具有相同PID 的每个传输流包而增加
- 当包的adaptation_field_control 为‘00’或‘10’时,
continuity_counter 不增加。
data_byte
//adaptation_field + body
07 50 00 00 80 F7 7E 00 00 00 01 E0 00 00 80 80 05 21 00 07 F0 0D 00
00 00 01 09 10 00 00 00 01 67 4D 40 33 95 A0 0F 00 10 FB 01 40 80 00
01 F4 80 00 75 30 70 00 00 0F 42 40 00 00 F4 24 0D DE 5C 1F 1C 32 A0
00 00 00 01 68 EE 3C 80 00 00 00 01 06 00 07 81 19 40 00 46 50 40 80
00 00 00 01 06 01 04 00 00 08 10 80 00 00 00 01 65 B8 04 04 1F 02 EB
03 FE 13 F0 D4 6D 2C 00 D1 DF 2D C0 00 00 03 00 00 03 00 00 03 00 00
03 00 00 2F 3D 76 1F D0 53 29 EE 83 00 00 03 00 00 03 00 00 03 00 00
03 00 04 30 04 00 00 03 00 00 03 00 00 05 EC 00 00 03 00 00 03 00 00
自适应字段
因为上面包头中adaptation_field_control - 2bit - 11,所以包头之后应该有自适应字段,并且
**adaptation_field_length - 8bit - **