标准定义
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[32..30] | 3 | 系统时钟基准(高位) 基于 90kHz 的系统时钟。用于音视频同步的主时间轴。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| System Clock Reference Base[29..15] | 15 | 系统时钟基准(中位) 接上文的 33 位时间戳。 |
| Marker Bit | 1 | 标志位 固定为 1。 |
| System Clock Reference Base[14..0] | 15 | 系统时钟基准(低位) 完成 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 | 视频流数量上限 指示该节目流中最多包含多少个视频流。 |
| 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 包长度 定义该字段之后(即从可选扩展头开始到有效载荷结束)的字节总数。 |
| '10' | 2 | 标识 |
| PES_scrambling_control | 2 | 表示 PES 分组有效负载的加密模式,不加密时建议置 0,否则置 01,10 和 11 保留。 |
| PES_priority | 1 | 指示 PES 分组负载的优先级。1高优先级,0低优先级。非参考帧(包括 B 帧和海康流中使用E 帧时的 P 帧)应置 0,其余帧置 1。 |
| data_alignment_indicator | 1 | 置1表明此 PES 分组头部之后是 data_stream_alignment_descriptor 所定义的访问单元数据类型。若为‘0’,则没有定义是否对准。建议当是输入单元的第一个包时置 1,其余置 0。 |
| copyright | 1 | 置‘1’,表明相应 PES 分组的有效负载中的数据是有版权的,建议置 0。 |
| original_or_copy | 1 | |
| PTS_DTS_flag | 2 | 标志 PES 首部含有 PTS, DTS 的状态。‘1x’表明 PES 首部含有 PTS,若为‘x1’, 则首部含有 DTS。PTS, presentation_time_stamp, DTS, decoding_time_stamp, 建议置‘10’或‘00’。 |
| ESCR_flag | 1 | 置‘1’表示 ESCR 的 base 和 extension 字段都在 PES 分组首部出现;建议置 0。 |
| ES_rate_flag | 1 | 置‘1’表示 PES 首部有 ES_rate 字段;建议置 0。 |
| DSM_trick_mode_flag | 1 | 置‘1’表示 PES 首部有 8bit 的 trick_mode_field;建议置 0。 |
| additional_copy_info_flag | 1 | 置‘1’表示有 additional_copy_info 字段;建议置 0。 |
| PES_CRC_flag | 1 | 置‘1’表示在 PES 首部分组中有 CRC 字段;建议置 0。 |
| PES_extension_flag | 1 | 置‘1’可选字段出现,当需要在每帧添加私有数据时建议置 1,其余情况置 0 |
| PES_header_data_length | 8 | 表示 PES 分组首部中可选字段和填充字节的总字节数。 |
| PTS | 1 | Presentation Time Stamp,表示该 PES 所包含的元素流单元的显示时刻。 PTS_DTS_flag为'10'时存在 |
| PES_private_data_flag | 1 | 置‘1’表示 PES 分组首部中含有私有数据;当需要在每帧添加私有数据时建议置 1,其余情况置 0,具体见 3.3。 |
| pack_header_field_flag | 1 | 置‘1’表示一个 ISO/IEC 11172 组首部或程序流组首部存储在此 PES 分组首部,建议置 0。 |
| program_packet_sequence_counter_flag | 1 | 置‘1’表示 PES 分组中有 program_packet_sequence_counter 和 original_stuff_length 字段。建议置 0。 |
| P-STD_buffer_flag | 1 | 置‘1’表示 PES 分组首部中有 P-STD_buffer_scale 和 P-STD_buffer_size 字段;建议置 0。 |
| P-PES_private_data | 128 | 用户私有数据,见可用扩展字段说明。 |
| PES_extension_flag2 | 1 | 置‘1’表示出现 PES_extension_field; 建议置 0。 |
| stuffing_byte | 1 | 填充字节,根据标准编码其应当在此填入 0xff,解码器端应当将这些字节抛弃。但为了减少解码延时,本文在此建议进行扩展 |
PTS字段详细定义
| 字段名称 | 长度 (bits) |
|---|---|
| '0010' | 4 |
| PTS[32..30] | 3 |
| marker_bit | 1 |
| PTS[29..15] | 15 |
| marker_bit | 1 |
| PTS[14..0] | 15 |
| marker_bit | 1 |
评论已关闭