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 OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程