mirror of
https://github.com/playBoyLj/GB28181-PS-demo.git
synced 2026-01-12 00:03:58 +08:00
main
GB28181组ps流demo
PS结构介绍
Key Point
- 一帧原始数据只能包含一个
ps,map,sys(关键帧需要)等结构.当一帧数据超过pes最大的负载时(0xFFFF),则一帧数据可能有多个pes结构 - rtp结构是包含在封装的最外层,所以 一帧数据或者一片pes结构,可能会被分成多个rtp包
- 各个结构中可能都有扩充字段,在解析的时候可以通过扩充字段来解析到表示的长度,从而得到真实的原始数据的长度
| ps | system header | psm | pesv | pesa |
pesv为视频pes包,pesa为音频pes包 非关键帧的ps包结构一般不包含系统头和PSM
针对PSM中流类型的取值如下:
| 流类型 | 十六进制值 |
|---|---|
| MPEG-4 | 0x10 |
| H.264 | 0x1B |
| SVAC | 0x80 |
| G.711 | 0x90 |
| G.722.1 | 0x92 |
| G.723.1 | 0x93 |
| G.729 | 0x99 |
| SVAC 音频 | 0x9B |
具体可以参看ISO/IEC 13818-1:2000 |
各个结构的头字段的说明
PS
| 字段名 | 比特位长度 | 含义 |
|---|---|---|
| pack_start_code | 32 | 起始码字段0x000001BA 标志为一包的开始 |
| marker_bit | 2 | 标记位字段2位字段,取值01 |
| system_clock_reference_base (32..30) | 3 | 系统时钟参考字段 |
| marker_bit | 1 | 标记位字段取值1 |
| system_clock_reference_base(29..15) | 15 | 系统时钟参考字段 |
| marker_bit | 1 | 标记位字段取值1 |
| system_clock_reference_base(14..0) | 15 | 系统时钟参考字段 |
| marker_bit | 1 | 标记位字段取值1 |
| system_clock_reference_extension | 9 | 系统始终参考字段 |
| marker_bit | 1 | 标记位字段取值1 |
| program_mux_rate | 22 | 节目复合速率字段 |
| marker_bit | 1 | 标记記位字段取值1 |
| marker_bit | 1 | 标记位字段取值1 |
| reserved | 5 | 填充字段 |
| pack_stuffing_length | 3 | 包填充长度字段 |
System
| 字段名 | 比特位长度 | 含义 |
|---|---|---|
| system_header_start_code | 32 | 开始码 0x000001BB |
| header_length | 16 | 該字段後的系統標題的字節長度 |
| marker_bit | 1 | 标记位字段取值1 |
| rate_bound | 22 | 速率界限字段 |
| marker_bit | 1 | 标记位字段取值1 |
| audio_bound | 6 | 音频界限字段 |
| fixed_flag | 1 | 固定标志字段 |
| CSPS_flag | 1 | CSPS标志字段 |
| system_audio_lock_flag | 1 | 系統音频锁定标志字段 |
| system_video_lock_flag | 1 | 系統视频锁定标志字段 |
| marker_bit | 1 | 标记位字段取值1 |
| vedio_bound | 5 | 视频界限字段 |
| packet_rate_restriction_flag | 1 | 分组速率限制标记字段 |
| reserved_bits | 7 | 保留位字段 |
| stream_id | 8 | 流标志字段 一般0xe0指视频,0xc0音频 |
| marker_bit | 2 | 取值11 |
| P-STD_buffer_bound_scale | 1b | P-STD界限比例字段 |
| P-STD_buffer_size_bound | 13 | P-STD大小界限字段 |
| 注:可能会有多个stream , 通过stream_id的第一个bit判断是否存在stream |
Map
| 字段名 | 比特位长度 | 含义 |
|---|---|---|
| packet start code | 32 | 映射流起始码标志字段 |
| program stream map length | 16 | 节目流映射长度字段 |
| current_next_indicator | 1 | 当前下一個指示符字段 |
| reserved | 2 | 填充字段 |
| program_stream_map_version | 5 | 节目流映射版本字段 |
| reserved | 7 | 预留填充字段 |
| marker_bit | 1 | 标记位字段取值1 |
| program_stream_info_length | 16 | 节目流信息长度字段 |
| elementary_stream_map_length | 16 | 基本流映射长度字段 |
| stream_type | 8 | 流类型字段 0x1b H264, 0x24 H265 |
| elementary_stream_id | 8 | 视频取值0xe0-0xef,通常为0xe0,音频取值0xc0-0xdf,通常为0xc0 |
| elementary_stream_info_length | 16 | 基本流信息长度字段 |
| CRC_32 | 32 | CRC字段 |
PES
| 字段名 | 比特位长度 | 含义 |
|---|---|---|
| packet_start_code_prefix | 24 | 分组起码码0x000001 |
| stream_id | 8 | 流标志字段stream_id,其中0x(C0 |
| PES_packet_length | 16 | PES分组长度字段 |
| marker_bit | 2 | 标志位,10 |
| PES_scrambling_control | 2 | PES加扰控制字段 |
| PES_priority | 1 | PES优先级字段 |
| data_alignment_indicator | 1 | 数据对其指示符字段 |
| copyright | 1 | 盘权字段 |
| original_or_copy | 1 | 原始或拷贝字段 |
| PTS_DTS_flags | 2 | PTS DTS标志字段 |
| ESCR_flag | 1 | ESCR标志字段 |
| ES_rate_flag | 1 | ES速率标志字段 |
| DSM_trick_mode_flag | 1 | DSM特技方式标志字段 |
| additional_copy_info_flag | 1 | 附加版权信息标志字段 |
| PES_CRC_flag | 1 | PES CRC标志字段 |
| PES_extension_flag | 1 | PES扩张标志字段 |
| PES_header_data_length | 8 | PES标题数据长度字段 |
注:后面会根据此长度来填写 pts, dts等
Description
Languages
C
100%