标准定义
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 Code | 32 | 包起始码 固定值为 0x000001BA。用于标识一个 PS 包的开始,解码器通过搜索此码实现同步。 |
| Scramble Control | 2 | 加扰控制 固定为 01(二进制),表示符合 MPEG-2 标准。 |
| System Clock Reference Base | 33 | 系统时钟基准(高位) 基于 90kHz 的系统时钟。用于音视频同步的主时间轴。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| System Clock Reference Base | 15 | 系统时钟基准(中位) 接上文的 33 位时间戳。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| System Clock Reference Base | 14 | 系统时钟基准(低位) 完成 33 位的时间戳定义。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| System Clock Reference Extension | 9 | 系统时钟基准扩展 基于 27MHz 的时钟精度,用于微调 SCR 的精确度。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Program Mux Rate | 22 | 节目复用速率 表示该节目流的传输速率。单位为 50 字节/秒(即数值 × 400 = bps)。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Reserved | 5 | 保留位 固定为 11111(二进制)。 |
| Pack Stuffing Length | 3 | 包填充长度 指示在该头部末尾有多少个字节的填充数据( 0xFF)。用于保持 4 字节对齐或调整包大小。 |
| Stuffing Bytes | 8 × N | 填充字节 长度为 Pack Stuffing Length 指定的字节数,每个字节固定为 0xFF。 |
PSS(PSSystem Header)
- 包含系统级别的信息
- 通常以0x000001BB开始
头部定义
| 字段名称 | 长度 (bits) | 含义与说明 |
|---|---|---|
| System Header Start Code | 32 | 系统头起始码 固定值为 0x000001BB,用于标识系统头的开始。 |
| Header Length | 16 | 头部长度 指示紧随其后的系统头数据的字节数。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Rate Bound | 22 | 速率边界 表示整个节目流的最大传输速率。单位为 50 字节/秒。解码器利用此值来管理缓冲区,防止溢出。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Audio Bound | 6 | 音频流数量上限 指示该节目流中最多包含多少个音频流。 |
| Fixed Flag | 1 | 固定标志 若为 1,表示流的比特率是固定的;若为 0,则表示是可变的。 |
| CSPS Flag | 1 | CSPS标志 若为 1,表示后面会跟着一个 0x000001B9 的起始码(通常用于DVD导航)。 |
| System Audio Lock Flag | 1 | 系统音频锁定标志 用于指示音频采样时钟是否与系统时钟锁定。 |
| System Video Lock Flag | 1 | 系统视频锁定标志 用于指示视频帧率是否与系统时钟锁定。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Video Bound | 5 | 视频流数量上限 指示该节目流中最多包含多少个视频流。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Packet Rate Restriction Flag | 1 | 包速率限制标志 若为 1,表示对 PS 包的发送速率有特定限制。 |
| Reserved Bits | 7 | 保留位 固定为 1111111(二进制)。 |
PSM(PS System Map)
- 包含系统映射信息,用于确定payload中的ES流类型
- 通常以0x000001BC开始
头部定义
| 字段名称 | 长度 (bits) | 含义与说明 |
|---|---|---|
| System Header Start Code | 32 | 包起始码前缀 固定值为 0x000001BC。 |
| Program Stream Map Length | 16 | PSM 长度 指示紧随其后的 PSM 数据的总字节数。 |
| Current Next Indicator | 1 | 当前/下一个指示符1 表示当前 PSM 可用;0 表示当前 PSM 不可用,下一个才可用。 |
| Reserved | 2 | 保留位 固定为 11(二进制)。 |
| Program Stream Map Version | 5 | PSM 版本号 取值范围 0-31。当 PSM 内容更新时,版本号会循环累加。 |
| Reserved | 7 | 保留位 固定为 1111111(二进制)。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| Program Stream Info Length | 16 | 节目流信息长度 指示后面“节目流描述符”的总长度,通常为 0。 |
| Elementary Stream Map Length | 16 | 基本流映射表长度 指示后面“基本流映射列表”的总字节数。 |
基本流映射列表(Elementary Stream Map)
| 字段名称 | 长度 (bits) | 含义与说明 |
|---|---|---|
| Stream Type | 8 | 流类型 定义基本流的编码格式。例如: • 0x1B: H.264 视频• 0x0F: AAC 音频• 0x90: G.711 A-law 音频• 0x91: G.711 μ-law 音频 |
| Elementary Stream ID | 8 | 基本流 ID 与该流类型对应的 PES 包的流 ID。例如,视频流的 ID 通常是 0xE0,音频流是 0xC0。 |
| Elementary Stream Info Length | 16 | 基本流信息长度 指示后面“基本流描述符”的长度,通常为 0。 |
PES(PS Header)
- 包含实际的媒体数据
- 视频包通常以0x000001E0开始
- 音频包通常以0x000001C0开始
头部定义
| 字段名称 | 长度 (bits) | 含义与说明 |
|---|---|---|
| packet_start_code_prefix | 24 | 包起始码前缀 固定值为 0x000001,用于标识一个 PES 包的开始。 |
| stream_id | 8 | 流 ID 标识 PES 包内数据的类型。 • 视频流: 0xE0 - 0xEF• 音频流: 0xC0 - 0xDF |
| PES_packet_length | 16 | PES 包长度 定义该字段之后(即从可选扩展头开始到有效载荷结束)的字节总数。 |
PES 扩展头(Optional PES Header)
| 字段名称 | 长度 (bits) | 含义与说明 |
|---|---|---|
| PTS_DTS_flags | 2 | PTS/DTS 标志位 指示包头中是否包含时间戳。 • 11: 同时包含 PTS 和 DTS。• 10: 只包含 PTS。• 00: 不包含 PTS 或 DTS。 |
| PES_header_data_length | 8 | PES 包头数据长度 定义从该字段之后到 PES 包头结束的字节数。解码器根据此长度跳过所有可选字段,直接定位到有效载荷。 |
| PTS (Presentation Time Stamp) | 33 | 显示时间戳 指示当前音频或视频帧应该在何时被显示出来,是实现音画同步的关键。单位为 1/90000 秒。 |
| DTS (Decoding Time Stamp) | 33 | 解码时间戳 指示当前音频或视频帧应该在何时被解码。对于 B 帧,DTS 和 PTS 的值不同,因为 B 帧需要先于参考帧解码,但后于参考帧显示。 |
评论已关闭