mpeg-ps视频流

101 阅读5分钟

写在前面

  • 学习流媒体的代码中,对于如何获取ps视频流中的实际视频数据产生疑问,所以结合文档编写了一个ps视频流解析器,同时收集部分知识列举在这里。

ps_parser ps视频流文件解析器

  • 通过解析ps文件打印出ps中的视频信息
  • 跳过音频帧
  • 解析ps格式

PsHeader格式

┌──────────────────────────────┐
│       Program Stream (PS)    │
├──────────────────────────────┤
│        Pack Header           │ ← 🟢 Start Code: BA
├──────────────────────────────┤
│      System Header (可选)     │ ← 🟡 Start Code: BB
├──────────────────────────────┤
│  Program Stream Map (可选)    │ ← 🔷 Start Code: BC
├──────────────────────────────┤
│       PES Packet(s)          │ ← 🎬 Start Code: E0 (视频), C0 (音频)
│       PES Packet(s)          │
└──────────────────────────────┘
  • 头格式
0x000001BA Pack Header(包头)
0x000001BB System Header(系统头)
0x000001BC Program Stream Map(程序流映射)
0x000001BD 私有流1(Private Stream 1,通常音频)
0x000001BE Padding Stream(填充流)
0x000001BF 私有流2(Private Stream 20x000001E0~0x000001EF  视频流(0xE0开始)
0x000001C0~0x000001DF  音频流(0xC0开始)

packHeader 字段格式

字段名长度(字节)描述
pack_start_code4固定为 0x000001BA,标识为 Pack Header
system_clock_reference_base [32~30]3 bitSCR(系统时钟参考)高位,用于同步音视频
marker_bit1 bit必须为1,固定位
system_clock_reference_base [29~15]15 bitSCR 中间位
marker_bit1 bit必须为1
system_clock_reference_base [14~0]15 bitSCR 低位
marker_bit1 bit必须为1
system_clock_reference_extension9 bitSCR 的扩展部分
marker_bit1 bit必须为1
program_mux_rate22 bit码率(单位:50字节/秒)
marker_bit1 bit必须为1
reserved5 bit保留位
pack_stuffing_length3 bit后续 stuffing 字节的数量(padding)

systemHeader 字段格式

字段名长度(字节)描述
system_header_start_code4固定为 0x000001BB,标识为 System Header
header_length2剩余字段长度(不含前6字节)
marker_bit1 bit必须为1
rate_bound22 bit最大码率(单位:50字节/秒)
marker_bit1 bit必须为1
audio_bound6 bit最大音频流数量
fixed_flag1 bit固定比特率标志
CSPS_flag1 bit成分流同步标志
system_audio_lock_flag1 bit音频锁定标志
system_video_lock_flag1 bit视频锁定标志
marker_bit1 bit必须为1
video_bound5 bit最大视频流数量
packet_rate_restriction_flag1 bit包速率限制标志
reserved_bits7 bit保留位
stream_id(重复N次)1流 ID(0xE0 开头为视频,0xC0 开头为音频)
P_STD_buffer_bound_scale1 bit缓冲大小标志
P_STD_buffer_size_bound13 bit缓冲区大小

Program Stream Map 字段格式

字段名长度(字节)描述
program_stream_map_start_code4固定为 0x000001BC,表示是 Program Stream Map
program_stream_map_length2后续字段总长度(不包括前6字节)
current_next_indicator1 bit当前有效标志(一般为1)
reserved_12 bit保留位
program_stream_map_version5 bit映射版本号
reserved_27 bit保留位
marker_bit1 bit必须为1
program_stream_info_length2描述符区长度(可选信息)
descriptor(可变)N若干描述符,长度为上面字段决定
elementary_stream_map_length2Elementary stream 区长度
stream_type1流类型(如 SVAC = 0x80,H.264 = 0x1B)
elementary_stream_id1对应的 ES 流 ID(例如视频一般是 0xE0)
elementary_stream_info_length2描述符区长度
descriptor(可变)N流相关的描述符
CRC_324CRC 校验(ISO/IEC 13818-1 定义)

pes packet 格式

┌────────────────────────────────────────────┐
│         PES Packet (Packetized ES)         │
├────────────────────────────────────────────┤
│  Start Code Prefix: 0x000001 (3 bytes)     │ ← 固定起始码
├────────────────────────────────────────────┤
│  Stream ID (1 byte)                        │ ← 如 E0: 视频, C0: 音频
├────────────────────────────────────────────┤
│  PES Packet Length (2 bytes)               │ ← 从可选字段起的长度
├────────────────────────────────────────────┤
│  Optional PES Header (可选字段)            │ ← 包含 PTS/DTS 等
├────────────────────────────────────────────┤
│  ES Payload (实际音/视频数据)              │
└────────────────────────────────────────────┘

PES header 头信息

┌────────────────────────────────────────────┐
│        Optional PES Header Flags           │
├────────────────────────────────────────────┤
│  '10' (2 bits)                              │ ← 固定值
│  Scrambling Control (2 bits)               │ ← 是否加密
│  Priority / Alignment / Copyright...       │ ← 共 8 位标志
├────────────────────────────────────────────┤
│  PTS_DTS_flags (2 bits)                    │ ← 是否含 PTS/DTS
│  ESCR_flag / ES_rate_flag / CRC_flag 等    │ ← 共 8 个控制标志
├────────────────────────────────────────────┤
│  PES_header_data_length (1 byte)           │ ← 后续可选字段长度
├────────────────────────────────────────────┤
│  [PTS / DTS / ESCR / ES_rate / ...]        │ ← 可选字段(依 flags 而定)
└────────────────────────────────────────────┘
字段名称位数长度(字节)内容定义
'10'2 位-固定值 10,表示是 MPEG-2 PES。
Scrambling Control2 位-是否加扰(00 表示未加扰)。
Priority1 位-数据优先级(通常为0)。
Data Alignment Indicator1 位-若为1表示此处对齐视频帧/音频帧起始点。
Copyright1 位-是否为版权内容(通常为0)。
Original or Copy1 位-是否为原始内容。
字段名称位数长度(字节)内容定义
PTS DTS Flags2 位-10 表示有 PTS,11 表示有 PTS 和 DTS。
ESCR Flag1 位-ESCR(扩展系统时钟参考)是否存在。
ES Rate Flag1 位-ES(Elementary Stream)码率字段是否存在。
DSM Trick Mode Flag1 位-是否包含 trick mode 数据(快进、快退等)。
Additional Copy Info Flag1 位-是否包含复制信息。
PES CRC Flag1 位-是否包含 CRC 校验。
PES Extension Flag1 位-是否包含扩展字段。
PES Header Data Length8 位1 字节表示紧随其后的 header 数据长度(例如 PTS、DTS)。

参考文档