本文主要是介绍GB/T28181数据流分析学习笔记1:PS数据格式解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GB/T28181数据流分析学习笔记1:PS数据格式解析
文章目录
- GB/T28181数据流分析学习笔记1:PS数据格式解析
- 1. GB/T28181摘要
- 2. IDE帧抓包分析
- 2.1 原始数据hex
- 2.2 原始数据分析
- 2.3 PS包头
- 2.3.1 PS原始数据
- 2.3.2 PS包头解析图
- 2.3.3 PS包头解析
- 2.4 系统包头(System header)
- 2.4.1 原始数据
- 2.4.2 系统包头(System header)解析图
- 2.4.3 系统包头(System header)解析
- 2.5 PSM(Program Stream Map)解析
- 2.5.1 PSM(Program Stream Map)原始数据
- 2.5.2 PSM(Program Stream Map)解析图
- 2.5.3 PSM(Program Stream Map) 解析
- 2.6 PES解析
- 2.6.1 PES原始数据
- 2.6.2 PES解析图
- 2.6.3 PES 解析
- 3 非IDE帧抓包分析
- 3.1 原始数据hex
- 4 音频帧抓包分析
- 4.1 原始数据hex
1. GB/T28181摘要
基于 RTP 的 PS 封装首先按照ISO/IEC13818-1:2000 将视音频流封装成 PS 包, 再将 PS 包以负
载的方式封装成 RTP 包。
进行 PS 封 装 时, 应 将 每 个 视 频 帧 封 装 为 一 个 PS 包, 且 每 个 关 键 帧 的 PS 包 中 应 包 含 系 统 头
(System Header) 和 PSM(Program Stream Map) , 系统头和 PSM 放置于 PS 包头之后、 第一个 PES 包
之前。
典型的视频关键帧 PS 包结构如图 C.1 所示, 其中 PESV 为视频 PES 包,PESA 为音频 PES 包, 视
频非关键帧的 PS 包结构中一般不包含系统头和 PSM。 PS 包中各部分的具体数据结构参见ISO/IEC
13818-1: 2000 中的相关描述。
(找不到ISO/IEC13818-1:2000.pdf文件可以联系我微信:yjkhtddx)
(放我个人服务器上供下载:http://dev.liuyunuo.cn:8084/doc/iso13818-1.pdf, 跪求不要攻击我)
PS包格式
PS包头 | System header | PSM | PESV | PESA |
---|
系统头应包含对 PS 包中码流种类的描述, 其中视频和音频的流ID(stream_id) 取值如下:
a) 视频流ID:0xE0;
b) 音频流ID:0xC0。
针对本文档规定的几种视音频格式,PSM 中流类型(stream_type) 的取值如下:
a) MPEG-4 视频流:0x10;
b) H.264 视频流:0x1B;
b+) H.265 视频流: 0x24
c) SVAC 视频流:0x80;
d) G.711 音频流:0x90;
e) G.722.1 音频流:0x92;
f) G.723.1 音频流:0x93;
g) G.729 音频流:0x99;
h) SVAC 音频流:0x9B。
PS 包封装的其他具体技术规范详见ISO/IEC13818-1:2000。
PS 包的 RTP 封装格式参照IETF RFC2250,RTP 的主要参数设置如下:
a) 负载类型(payloadtype) :96;
b) 编码名称(encoding name) :PS;
c) 时钟频率(clockrate) :90 kHz;
d) SDP 描述中“m”字段的“media”项:video。
2. IDE帧抓包分析
2.1 原始数据hex
8060 02d8000b42d0 06146581 000001ba4400afe13401005f6bf8000001bb000c80ccf504e17fe0e0e8c0c020000001bc001ee1ff000000141be0000c2a0a7fff000023281ffea05a90c0000000000000000001e07fe080800521002bf84d
8060 02f1000b42d0 06146581 000001e080088000052100010001
8060 030a000b42d0 06146581 000001e059248000052100010001
2.2 原始数据分析
806000010000465006146581 =>RTP头部分,此文不做分析
000001ba440004000401005f6bf8 => PS包头 pack_start_code 0x000001BA
000001bb000c80ccf504e17fe0e0e8c0c020 => 系统包头 system_header_start_code 0x000001BB
000001bc001ee1ff000000141be0000c2a0a7fff000023281ffea05a90c0000000000000 => PSM packet_start_code_prefix + map_stream_id 0x000001BC
000001e07fe08080052100010001 => PSEV a) 视频流ID:0xE0; b) 音频流ID:0xC0 0x000001E0
2.3 PS包头
2.3.1 PS原始数据
000001ba440004000401005f6bf8
2.3.2 PS包头解析图
2.3.3 PS包头解析
000001ba => pack_start_code
440004000401005f6bf8 => 解不开,不管了,跳过
2.4 系统包头(System header)
2.4.1 原始数据
000001bb000c80ccf504e17fe0e0e8c0c020
2.4.2 系统包头(System header)解析图
2.4.3 系统包头(System header)解析
000001bb => system_header_start_code
000c => header_length => 12个字节 => 剩余12个字节没有问题
80ccf504e17fe0e0e8c0c020 => 先不解开,没看到有需要的字段,长度对就直接跳过。
2.5 PSM(Program Stream Map)解析
2.5.1 PSM(Program Stream Map)原始数据
000001bc001ee1ff000000141be0000c2a0a7fff000023281ffea05a90c0000000000000
2.5.2 PSM(Program Stream Map)解析图
2.5.3 PSM(Program Stream Map) 解析
000001 => packet_start_code_prefix
bc => map_stream_id => 固定0xBC
001e => program_stream_map_length => 30个字节 => 没有问题
e1
ff
0000 => program_stream_info_length => 0个字节 => 没有问题
0014 => elementary_stream_map_length => 20个字节 => 没有问题
1b stream_type => H.264 视频流:0x1B;
e0 elementary_stream_id => 视频流ID:0xE0;
000c elementary_stream_info_length => 12个字节 => 没有问题
2a0a7fff000023281ffea05a => descriptor() => 先不管
90 stream_type => G.711 音频流:0x90
c0 elementary_stream_id => 音频流ID:0xC0
0000 elementary_stream_info_length => 0个字节 => 没有问题
00000000 => CRC_32 =>好像没有使用数据验证
最关键的编码格式获取到了,任务搞定。
2.5.4 番外篇H265
2016版本国标并没有明确制定H265,但是实际已经在使用了,抓了一个H265的PSM分析一下。
000001bc
001e
e1
ff
0000
0014
24 stream_type => H.265 视频流:0x24;
e0
000c
2a0a7fff000007081ffea05a
90
c0
0000
00000000
000001 => packet_start_code_prefix
bc => map_stream_id => 固定0xBC
001e => program_stream_map_length => 30个字节 => 没有问题
e1
ff
0000 => program_stream_info_length => 0个字节 => 没有问题
0014 => elementary_stream_map_length => 20个字节 => 没有问题
1b stream_type => H.264 视频流:0x1B;
e0 elementary_stream_id => 视频流ID:0xE0;
000c elementary_stream_info_length => 12个字节 => 没有问题
2a0a7fff000023281ffea05a => descriptor() => 先不管
90 stream_type => G.711 音频流:0x90
c0 elementary_stream_id => 音频流ID:0xC0
0000 elementary_stream_info_length => 0个字节 => 没有问题
00000000 => CRC_32 =>好像没有使用数据验证
2.6 PES解析
2.6.1 PES原始数据
000001e07fe08080052100010001
2.6.2 PES解析图
注:太长了,解析个长度好了。
2.6.3 PES 解析
000001 packet_start_code_prefix
e0 stream_id
7fe0 PES_packet_length => 数据在PES中,所以长度比较长
8080052100010001 => 懒的解
3 非IDE帧抓包分析
3.1 原始数据hex
8060 0092000278d0 06146581 000001ba440025913401005f6bf8000001e02544808005210009644d
4 音频帧抓包分析
4.1 原始数据hex
8060 009000023280 06146581 000001c00081808005210007d7ad
微信号:yjkhtddx
这篇关于GB/T28181数据流分析学习笔记1:PS数据格式解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!