标准定义

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