GB/T28181数据流分析学习笔记1:PS数据格式解析

2023-11-03 08:10

本文主要是介绍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 headerPSMPESVPESA

系统头应包含对 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数据格式解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336786

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php