标准定义

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 Base33系统时钟基准(高位)
基于 90kHz 的系统时钟。用于音视频同步的主时间轴。
Marker Bit1标志位
固定为 1
System Clock Reference Base15系统时钟基准(中位)
接上文的 33 位时间戳。
Marker Bit1标志位
固定为 1
System Clock Reference Base14系统时钟基准(低位)
完成 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视频流数量上限
指示该节目流中最多包含多少个视频流。
Marker Bit1标志位
固定为 1
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 包长度
定义该字段之后(即从可选扩展头开始到有效载荷结束)的字节总数。

PES 扩展头(Optional PES Header)

字段名称长度 (bits)含义与说明
PTS_DTS_flags2PTS/DTS 标志位
指示包头中是否包含时间戳。
11: 同时包含 PTS 和 DTS。
10: 只包含 PTS。
00: 不包含 PTS 或 DTS。
PES_header_data_length8PES 包头数据长度
定义从该字段之后到 PES 包头结束的字节数。解码器根据此长度跳过所有可选字段,直接定位到有效载荷。
PTS (Presentation Time Stamp)33显示时间戳
指示当前音频或视频帧应该在何时被显示出来,是实现音画同步的关键。单位为 1/90000 秒。
DTS (Decoding Time Stamp)33解码时间戳
指示当前音频或视频帧应该在何时被解码。对于 B 帧,DTS 和 PTS 的值不同,因为 B 帧需要先于参考帧解码,但后于参考帧显示。