TS协议解析第一部分(PAT)
1. 前言
1.1 工具准备:
ts文件 | http://download.csdn.net/detail/u013354805/9540190 |
UltraEdit | http://download.csdn.net/detail/u013354805/9540205 |
EStreamAnalyzer | http://download.csdn.net/detail/u013354805/8866107 |
Iso13818-1 规范 | http://download.csdn.net/detail/u013354805/8865315 |
1.2 界面:
1) UltraEdit打开ts文件(如果发现打开的是一堆乱请用ctrl +H以16进制打开):
2) EStreamAnalyzer打开TS文件如下:
2. 分析TS包:
传输流包长度必须是188字节,sync_byte必须是0x47。任何有用的数据都不会是FF。
2.1 第一个TS包:
PAT是Program Association Table的简称,即”节目关联表”. PAT定义了当前TS流中所有的节目,其PID恒为0x00,它是PSI信息的根节点,要查找节目必须从PAT表开始.PAT表描述了当前TS流中包含什么样的PID,主要包括当前流的NIT表格的PID,当前流中有多少个不同类型PMT表,每个PMT表对应的频道号等信息.
2.2 TS包头:
TS包头只有4个字节(47 60 00 10),除掉第一个字节0x47,剩下就3个,重新分组如下:
0 1 1 0000000000000 00 01 0000
sync_byte |
同步字节 |
0x47: |
transport_error_indicator |
传输错误标识 |
0: |
payload_unit_start_indicator |
负载单元开始标识 |
1:该字段用来表示TS包的有效净荷带有PES包或者PSI数据的情况。 当TS包带有PES包数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包的有效净荷以PES包的第一个字节开始;置为0,表示TS包的开始不是PES包。 当TS包带有PSI数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包带有PSI部分的第一个字节,即第一个字节带有指针pointer_field;置为0,表示TS包不带有一个PSI部分的第一个字节,即在有效净荷中没有指针pointer_field。 对于空包的包,payload_unit_start_indicator应该置为0。 |
transport_priority |
传输优先级 |
1: |
pid |
PID |
0x000:即为0,表示PAT |
transport_scrambling_control |
传输扰乱控制 |
00: |
adaptation_field_control |
自适应区域控制 |
00:是保留值。 |
continuity_counter |
连续计数器 |
0x0: |
同步字节 |
传输错误标识 |
负载单元开始标识 |
传输优先级 |
PID |
传输扰乱控制 |
自适应区域控制 |
连续计数器 |
8 |
1 |
1 |
1 |
13 |
2 |
2 |
4 |
第1个字节 |
第2、3个字节 |
第4个字节 |
table_id |
0x00:对于PAT只能是0x00 |
section_syntax_indicator |
1:应设置为‘1’ |
0 |
0: |
reserved |
11: |
section_length |
0000 0000 1101:为0xD,13 该字段的头两个比特必为‘00’,剩余10比特指定该分段的字节数,紧随分段长度字段开始,并包括CRC。此字段中,该值应不超过1021(0x3FD) |
transport_stream_id |
0x00:该字节充当标签,标识网络内此传输流有别于任何其他路复用流。其值由用户规定。 |
reserved |
11: |
version_number |
00000:一旦PAT有变化,版本号加1 |
current_next_indicator |
1:表示传送的PAT当前可以使用,若为0表示下一个表有效 |
section_number |
0x00:给出了该分段的数目。在PAT中的第一个分段的section_number为0x00,PAT中每一分段将加1。 |
last_section_number |
0x00:该字段指出了最后一个分段号。在整个PAT中即分段的最大数目。 |
program_number |
0x0001:这个为PMT。该字段指出了节目对于那个program_map_PID是可以使用的。如果是0x0000,那么后面的PID是网络PID,否则其他值由用户定义。 |
reserved |
111: |
program_map_PID |
0 0000 1000 0001:0x81该字段指出TS包中的PID值。 |
table_id |
8 |
第1个字节 |
section_syntax_indicator |
1 |
第2、3个字节 |
0 |
1 |
|
reserved |
2 |
|
section_length |
12 |
|
transport_stream_id |
16 |
第4、5个字节 |
reserved |
2 |
第6个字节 |
version_number |
5 |
|
current_next_indicator |
1 |
|
section_number |
8 |
第7个字节 |
last_section_number |
8 |
第8个字节 |
循环开始 |
||
program_number |
16 |
2个字节 |
reserved |
3 |
2个字节 |
network_id(节目号为0时) program_map_PID(节目号为其他时) |
13 |
|
循环结束 |
||
CRC_32 |
32 |
4个字节 |
3. 实现:
3.1 PAT表格定义如下:
typedef struct TS_PAT_Program
{unsigned program_number :16; //节目号unsigned program_map_PID :13; //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个
}TS_PAT_Program;
typedef struct TS_PAT
{unsigned table_id : 8; //固定为0x00 ,标志是该表是PATunsigned section_syntax_indicator : 1; //段语法标志位,固定为1unsigned zero : 1; //0unsigned reserved_1 : 2; // 保留位unsigned section_length : 12; //表示这个字节后面有用的字节数,包括CRC32unsigned transport_stream_id : 16; //该传输流的ID,区别于一个网络中其它多路复用的流unsigned reserved_2 : 2;// 保留位unsigned version_number : 5; //范围0-31,表示PAT的版本号unsigned current_next_indicator : 1; //发送的PAT是当前有效还是下一个PAT有效unsigned section_number : 8; //分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段unsigned last_section_number : 8; //最后一个分段的号码std::vector<TS_PAT_Program> program;unsigned reserved_3 : 3; // 保留位unsigned network_PID : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PIDunsigned CRC_32 : 32; //CRC32校验码
} TS_PAT;
3.3 解析代码如下:
HRESULT CTS_Stream_Parse::adjust_PAT_table( TS_PAT * packet, unsigned char * buffer)
{packet->table_id = buffer[0];packet->section_syntax_indicator = buffer[1] >> 7;packet->zero = buffer[1] >> 6 & 0x1;packet->reserved_1 = buffer[1] >> 4 & 0x3;packet->section_length = (buffer[1] & 0x0F) << 8 | buffer[2]; packet->transport_stream_id = buffer[3] << 8 | buffer[4];packet->reserved_2 = buffer[5] >> 6;packet->version_number = buffer[5] >> 1 & 0x1F;packet->current_next_indicator = (buffer[5] << 7) >> 7;packet->section_number = buffer[6];packet->last_section_number = buffer[7]; int len = 0;len = 3 + packet->section_length;packet->CRC_32 = (buffer[len-4] & 0x000000FF) << 24| (buffer[len-3] & 0x000000FF) << 16| (buffer[len-2] & 0x000000FF) << 8 | (buffer[len-1] & 0x000000FF); int n = 0;for ( n = 0; n < packet->section_length - 12; n += 4 ){unsigned program_num = buffer[8 + n ] << 8 | buffer[9 + n ]; packet->reserved_3 = buffer[10 + n ] >> 5; packet->network_PID = 0x00;if ( program_num == 0x00){ packet->network_PID = (buffer[10 + n ] & 0x1F) << 8 | buffer[11 + n ];TS_network_Pid = packet->network_PID; //记录该TS流的网络PIDTRACE(" packet->network_PID %0x /n/n", packet->network_PID );}else{TS_PAT_Program PAT_program;PAT_program.program_map_PID = (buffer[10 + n] & 0x1F) << 8 | buffer[11 + n];PAT_program.program_number = program_num;packet->program.push_back( PAT_program );TS_program.push_back( PAT_program );//向全局PAT节目数组中添加PAT节目信息 } }return 0;
}
TS协议解析第一部分(PAT)相关推荐
- TS协议解析第二部分(PMT)
1. PMT: PMT(Program Map Table):节目映射表,该表的PID是由PAT提供给出的.通过该表可以得到一路节目中包含的信息,例如,该路节目由哪些流构成和这些流的类型(视频,音频, ...
- TS协议解析第三部分(PES)
1. PES: 1.1 PES介绍: PES--Packetized Elementary Streams (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构.PES流是E ...
- HLS协议解析(含有pes分析)
1. 综述 HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些.HLS 协议由三部分组成:HTTP.M3U8.TS.这三部分中,HTT ...
- TS流解析 二 *****
1.TS格式介绍 TS:全称为MPEG2-TS.TS即"Transport Stream"的缩写.它是分包发送的,每一个包长为188字节(还有192和204个字节的包).包的结构为 ...
- TS流解析【PCR】自己的总结
http://www.cnblogs.com/ztteng/articles/3166025.html http://blog.csdn.net/liuhongxiangm/article/detai ...
- c语言解析ts流文件,TS流解析
1. 介绍:TS即是"Transport Stream"的缩写.他是分包发送的,每一个包长为188字节或者是204的字节(204字节的就是在后面添加了16字节主要用于高清解码), ...
- 详解BLE 空中包格式—兼BLE Link layer协议解析
BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...
- wireshark协议解析器 源码分析 封装调用
源码分析 Wireshark启动时,所有解析器进行初始化和注册.要注册的信息包括协议名称.各个字段的信息.过滤用的关键字.要关联的下层协议与端口(handoff)等.在解析过程,每个解析器负责解析自己 ...
- wireshark协议解析器原理与插件编写
工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...
最新文章
- django orm级联_第 03 篇:创建 Django 博客的数据库模型
- nodeJS中的异步编程
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
- 关于解决jdbc版本错误问题
- python编码规范总结、python编码转换
- 对用户密码进行加盐处理
- php控制打印机打印文档,word预览正常打印不全怎么解决?
- 应用--学生宿舍卫生管理系统
- Android Sophix热修复集成
- “C:\Users\用户名\AppData\里面的文件是什么?可以删除么??
- Admob反馈利诱性质流量(无效流量)解决方案
- 计算机中怎么改邮箱地址,谁可以讲讲如何设置电脑邮箱
- 离线翻译软件【免费电脑版】
- 牛市股票还会亏钱?----外观模式
- MySQL安装时的配置文件my.ini参考
- 怎样将discuz所有页面的Powered by Discuz!去掉
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】
- 牛油果是如何成为中产标配的?
- 带你读懂Java GC日志信息 教你如何使用工具查看【图文演示】
- 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)
热门文章
- 智慧大脑的搭建在智慧工地管理系统中有何作用
- AI医疗 | 人脸识别、智能导诊系统上线,医号馆将引领基层医疗新时代
- 高精度定位系统服务器,5G+UWB智慧工厂高精度定位解决方案
- opencv ocr文字识别_用OpenCV和OCR识别图片中的表格数据
- 人工智能 自动规划 ppt 蔡自兴_分布式优化算法及其在多智能体系统与机器学习中的应用【附PPT与视频资料】...
- 上海西门子培训-第一天(周末)
- 计算机丢失msvcr110.dll解决办法
- Linux-centos安装MySQL8.0.22连接驱动文件mysql-connector-java-8.0.22-1.el7.noarch.rpm
- PumpLinx离心泵水利仿真优化设计视频教程
- 煤企平均负债率高达54% 承兑比例骤增资金链堪忧