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

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实