标准定义

ISO/IEC 13818-1

PS流的基本结构

I帧的基本结构

[PS Header] → [PS System Header] → [‌PS System Map‌] → [PES Header] → [视频裸数据(如H.264 NALU)]

P帧的基本结构

[PS Header] → [PES Header] → [视频裸数据 (如H.264 NALU)]

音频数据的基本结构

音频数据通常跟在视频数据的后面

[PS Header] → [PES Header] → [视频裸数据 (如H.264 NALU)] → [音频裸数据]

PSH(PS Header)

  • 标识PS流的开始
  • 通常以0x000001BA开始

头部定义

字段名称长度 (bits)含义与说明
Pack Start Code32包起始码
固定值为 0x000001BA。用于标识一个 PS 包的开始,解码器通过搜索此码实现同步。
Scramble Control2加扰控制
固定为 01(二进制),表示符合 MPEG-2 标准。
System Clock Reference Base[32..30]3系统时钟基准(高位)
基于 90kHz 的系统时钟。用于音视频同步的主时间轴。
Marker Bit1标志位
固定为 1
System Clock Reference Base[29..15]15系统时钟基准(中位)
接上文的 33 位时间戳。
Marker Bit1标志位
固定为 1
System Clock Reference Base[14..0]15系统时钟基准(低位)
完成 33 位的时间戳定义。
Marker Bit1标志位
固定为 1
System Clock Reference Extension9系统时钟基准扩展
基于 27MHz 的时钟精度,用于微调 SCR 的精确度。
Marker Bit1标志位
固定为 1
Program Mux Rate22节目复用速率
表示该节目流的传输速率。单位为 50 字节/秒(即数值 × 400 = bps)。
Marker Bit1标志位
固定为 1
Marker Bit1标志位
固定为 1
Reserved5保留位
固定为 11111(二进制)。
Pack Stuffing Length3包填充长度
指示在该头部末尾有多少个字节的填充数据(0xFF)。用于保持 4 字节对齐或调整包大小。
Stuffing Bytes8 × N填充字节
长度为 Pack Stuffing Length 指定的字节数,每个字节固定为 0xFF

PSS(‌PSSystem Header‌)

  • 包含系统级别的信息
  • 通常以0x000001BB开始

头部定义

字段名称长度 (bits)含义与说明
System Header Start Code32系统头起始码
固定值为 0x000001BB,用于标识系统头的开始。
Header Length16头部长度
指示紧随其后的系统头数据的字节数。
Marker Bit1标志位
固定为 1
Rate Bound22速率边界
表示整个节目流的最大传输速率。单位为 50 字节/秒。解码器利用此值来管理缓冲区,防止溢出。
Marker Bit1标志位
固定为 1
Audio Bound6音频流数量上限
指示该节目流中最多包含多少个音频流。
Fixed Flag1固定标志
若为 1,表示流的比特率是固定的;若为 0,则表示是可变的。
CSPS Flag1CSPS标志
若为 1,表示后面会跟着一个 0x000001B9 的起始码(通常用于DVD导航)。
System Audio Lock Flag1系统音频锁定标志
用于指示音频采样时钟是否与系统时钟锁定。
System Video Lock Flag1系统视频锁定标志
用于指示视频帧率是否与系统时钟锁定。
Marker Bit1标志位
固定为 1
Video Bound5视频流数量上限
指示该节目流中最多包含多少个视频流。
Packet Rate Restriction Flag1包速率限制标志
若为 1,表示对 PS 包的发送速率有特定限制。
Reserved Bits7保留位
固定为 1111111(二进制)。

PSM(PS System Map‌)

  • 包含系统映射信息,用于确定payload中的ES流类型
  • 通常以0x000001BC开始

头部定义

字段名称长度 (bits)含义与说明
System Header Start Code32包起始码前缀
固定值为 0x000001BC
Program Stream Map Length16PSM 长度
指示紧随其后的 PSM 数据的总字节数。
Current Next Indicator1当前/下一个指示符
1 表示当前 PSM 可用;0 表示当前 PSM 不可用,下一个才可用。
Reserved2保留位
固定为 11(二进制)。
Program Stream Map Version5PSM 版本号
取值范围 0-31。当 PSM 内容更新时,版本号会循环累加。
Reserved7保留位
固定为 1111111(二进制)。
Marker Bit1标志位
固定为 1
Program Stream Info Length16节目流信息长度
指示后面“节目流描述符”的总长度,通常为 0。
Elementary Stream Map Length16基本流映射表长度
指示后面“基本流映射列表”的总字节数。

基本流映射列表(Elementary Stream Map)

字段名称长度 (bits)含义与说明
Stream Type8流类型
定义基本流的编码格式。例如:
0x1B: H.264 视频
0x0F: AAC 音频
0x90: G.711 A-law 音频
0x91: G.711 μ-law 音频
Elementary Stream ID8基本流 ID
与该流类型对应的 PES 包的流 ID。例如,视频流的 ID 通常是 0xE0,音频流是 0xC0
Elementary Stream Info Length16基本流信息长度
指示后面“基本流描述符”的长度,通常为 0。

PES(PS Header)

  • 包含实际的媒体数据
  • 视频包通常以0x000001E0开始
  • 音频包通常以0x000001C0开始

头部定义

字段名称长度 (bits)含义与说明
packet_start_code_prefix24包起始码前缀
固定值为 0x000001,用于标识一个 PES 包的开始。
stream_id8流 ID
标识 PES 包内数据的类型。
• 视频流: 0xE0 - 0xEF
• 音频流: 0xC0 - 0xDF
PES_packet_length16PES 包长度
定义该字段之后(即从可选扩展头开始到有效载荷结束)的字节总数。
'10'2标识
PES_scrambling_control2表示 PES 分组有效负载的加密模式,不加密时建议置 0,否则置 01,10 和 11 保留。
PES_priority1指示 PES 分组负载的优先级。1高优先级,0低优先级。非参考帧(包括 B 帧和海康流中使用E 帧时的 P 帧)应置 0,其余帧置 1。
data_alignment_indicator1置1表明此 PES 分组头部之后是 data_stream_alignment_descriptor 所定义的访问单元数据类型。若为‘0’,则没有定义是否对准。建议当是输入单元的第一个包时置 1,其余置 0。
copyright1置‘1’,表明相应 PES 分组的有效负载中的数据是有版权的,建议置 0。
original_or_copy1
PTS_DTS_flag2标志 PES 首部含有 PTS, DTS 的状态。‘1x’表明 PES 首部含有 PTS,若为‘x1’, 则首部含有 DTS。PTS, presentation_time_stamp, DTS, decoding_time_stamp, 建议置‘10’或‘00’。
ESCR_flag1置‘1’表示 ESCR 的 base 和 extension 字段都在 PES 分组首部出现;建议置 0。
ES_rate_flag1置‘1’表示 PES 首部有 ES_rate 字段;建议置 0。
DSM_trick_mode_flag1置‘1’表示 PES 首部有 8bit 的 trick_mode_field;建议置 0。
additional_copy_info_flag1置‘1’表示有 additional_copy_info 字段;建议置 0。
PES_CRC_flag1置‘1’表示在 PES 首部分组中有 CRC 字段;建议置 0。
PES_extension_flag1置‘1’可选字段出现,当需要在每帧添加私有数据时建议置 1,其余情况置 0
PES_header_data_length8表示 PES 分组首部中可选字段和填充字节的总字节数。
PTS1Presentation Time Stamp,表示该 PES 所包含的元素流单元的显示时刻。 PTS_DTS_flag为'10'时存在
PES_private_data_flag1置‘1’表示 PES 分组首部中含有私有数据;当需要在每帧添加私有数据时建议置 1,其余情况置 0,具体见 3.3。
pack_header_field_flag1置‘1’表示一个 ISO/IEC 11172 组首部或程序流组首部存储在此 PES 分组首部,建议置 0。
program_packet_sequence_counter_flag1置‘1’表示 PES 分组中有 program_packet_sequence_counter 和 original_stuff_length 字段。建议置 0。
P-STD_buffer_flag1置‘1’表示 PES 分组首部中有 P-STD_buffer_scale 和 P-STD_buffer_size 字段;建议置 0。
P-PES_private_data128用户私有数据,见可用扩展字段说明。
PES_extension_flag21置‘1’表示出现 PES_extension_field; 建议置 0。
stuffing_byte1填充字节,根据标准编码其应当在此填入 0xff,解码器端应当将这些字节抛弃。但为了减少解码延时,本文在此建议进行扩展

PTS字段详细定义

字段名称长度 (bits)
'0010'4
PTS[32..30]3
marker_bit1
PTS[29..15]15
marker_bit1
PTS[14..0]15
marker_bit1