一、EIT表简介
EIT按时间顺序提供每一个节目业务中包含的节目段的信息。

二、TS包头结构

其中EIT表的PID为0X12;
要根据这个PID值从TS码流中过滤出所有属于EIT的ts包;
除了PID,TS包头中还需要考虑的参数有:
syn_byte=0x47(标识正确的包的起始位置)
transport_error_indicator=0(标识当前传输的ts包无明显错误)
payload_unit_start_indicator(很重要的一个参数,为1标识该包为一个段的起始ts包,且ts包有效负载第一位为指针pointer_field;为0,则标识有效负载中没有指针。)
adaptation_field_control(当其值为00或10时,标识continuity_counter不连续,该ts包及该段中之前的ts要被丢弃)

三、EIT表结构


筛选出PID==0x12的ts包,并按一定规则拼接为段后,我们要分析EIT短信息。
因为我们分析的是P/F信息,因此只取 table_id=0x4E的EIT段。其中需要考虑的参数有:
section_length(标识从下一个字节起,该section包含的字节数)
service_id(标识节目号)
version_number(版本号,随时间更新)
current_next_indicator(为1,标识当前表有效;为0,标识下一个子表才有用)
section_number(标识EIT表中包含的section个数,因为我们分析的P/F信息,只包含section_number为0和为1的段,因此该参数不用特意分析考虑,只需最后直接输出)
start_time(标识该节目的起始时间)
duration_time(标识该节目的持续时间)
descriptor_loop_length(接下来的循环包含的总的字节数)
discriptor有很多种,我们只分析包含名称信息的短节目段描述符,即选descriptor_tag==0X4D。该描述符的结构如下:

其中descriptor_length标识下一字节开始,该描述符的长度;
event_name_length标识名称信息占用的字节数;event_name_char标识节目名称信息。
四、码流分析仪中的EIT结构显示:

通过C++分析完一段数据后,可以比照码流分析仪中显示的时间、名称信息来看看自己的程序是否正确。

五、代码段
1、ts_packet类

//ts_packet类
#include<iostream>
#include <cstring>
class Ts_Packet
{
private:unsigned sync_byte;unsigned transport_error_indicator;unsigned payload_unit_start_indicator;unsigned PID;  unsigned adaptation_field_control;//unsigned continuity_counter;unsigned offset;unsigned char payload[184];
public:Ts_Packet();Ts_Packet(unsigned char tsHeadbuff[188] );~Ts_Packet(){};unsigned get_sync_byte();unsigned get_transport_error_indicator();unsigned get_payload_unit_start_indicator();unsigned get_PID();unsigned get_adaptation_field_control();//unsigned get_continuity_counter();unsigned get_offset();unsigned char *get_payload();void print_tsheader();
};   

2、ts_packet类的成员函数实现


#include"a_Ts_Packet.h"
Ts_Packet::Ts_Packet()
{sync_byte = 0;   transport_error_indicator =0;payload_unit_start_indicator =0;PID =0;adaptation_field_control=0;offset=0;   memset(payload, 0, 184);
};
Ts_Packet::Ts_Packet(unsigned char tsHeadbuff[188])
{sync_byte = tsHeadbuff[0];   transport_error_indicator = tsHeadbuff[1] >> 7;payload_unit_start_indicator = ((tsHeadbuff[1] >> 6) & 0x01);PID = ((tsHeadbuff[1] & 0x1F) << 8 ) | tsHeadbuff[2];adaptation_field_control=(tsHeadbuff[3]&0x30)>>4;offset=tsHeadbuff[5];   for(int i=0;i<184;i++){payload[i]=tsHeadbuff[4+i];}
}
unsigned Ts_Packet::get_sync_byte(){return sync_byte;}
unsigned Ts_Packet::get_transport_error_indicator(){return transport_error_indicator;};
unsigned Ts_Packet::get_payload_unit_start_indicator(){return payload_unit_start_indicator;};
unsigned Ts_Packet::get_PID(){return PID;};
unsigned Ts_Packet::get_offset(){return offset;};
unsigned char*Ts_Packet::get_payload(){return payload;};
unsigned Ts_Packet::get_adaptation_field_control(){return adaptation_field_control;};void Ts_Packet::print_tsheader()
{printf("%02x ",sync_byte); printf("%02x ",transport_error_indicator);printf("%02x ",payload_unit_start_indicator);printf(

C++解析EIT表中的P-F信息相关推荐

  1. 1. 在顺序存储结构的职工工资表中,职工工资信息包括:职工号(no)、姓名(name )、职称(pro)、工资(sal)等四项信息,请编写一完整的程序。

    在顺序存储结构的职工工资表中,职工工资信息包括:职工号(no).姓名(name ).职称(pro).工资(sal)等四项信息,请编写一完整的程序,实现以下功能: (1)创建信息表:从键盘读入所有职工的 ...

  2. 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...

    查看并导出SQL Server 2000数据表中字段的注释信息: 此示例为导出某个表注释的语句:(表名是bbs_bank_log) SELECT sysobjects.name AS 表名, sysc ...

  3. jdbc获取mysql 列信息_JDBC获取数据库信息:获取表中各列的信息

    ResultSet getColumns(String catalog,String schemaPattern,String tableNamePattern,String columNamePat ...

  4. mysql索引碎片产生原因_解析mysql 表中的碎片产生原因以及清理

    大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 . 对于不同的存储引擎整理碎片的方式不一样. myisam 可以有以下方式: mysql> sho ...

  5. TS码流解析-6-解析EIT表

    任务六 利用之前编写的函数,从码流中解析EIT表,主要是获取对应的service_id和EPG标题,时间段等. 相关知识 简述 EIT表按照时间顺序提供每一个业务所包含的事件信息,是事件信息表的简称, ...

  6. python 解析excel表并排重输出到txt

    需求 解析excel表中每个单元格的元素,并且排重后输出到txt文件中,保存格式为UTF-8 程序 pip install xlrd import xlrd# 保存唯一字符的列表 convert_li ...

  7. Oracle中通过Function,存储过程,触发器,调用实现解析Clob字段中存在的xml字符串...

    摘要:接着之前的问题,在Oracle数据库中通过Function,存储过程,触发器实现解析数据表中CLOB大数据字段中存在的xml字符串有时,有个特殊的时间字符串要在数据库格式化处理,之前解析过来的时 ...

  8. oracle 字段补充空格,oracle表中某个字段含有字符回车、空格的手动修改方式

    select t.*, t.rowid from TB_SD_STANDARD_CHOOSE_ADVISE t where t.id =323900000 update TB_SD_STANDARD_ ...

  9. MySQL数据库将查询结果插入到其它表中

    假如目前只有一个goods表,想要增加一个商品分类信息,简单通过goods表无法完成商品分类的添加,这时可以再创建一个商品分类表,把goods表中的商品分类信息添加到该表中,将goods表中的分类名称 ...

最新文章

  1. 今日头条”入局搜索:流量巨头的生存空间之战!
  2. java小程序查看器_JAVA的一个查看图片的小程序
  3. 变量声明和定义有什么区别
  4. android之 实现对搜索框输入内容(自动出现匹配内容)
  5. 北大OJ百练——4074:积水量(C语言)
  6. es index 改名_Elasticsearch Index模块
  7. python关键字与标识符
  8. html制作百度首页的图片不显示,html实现像百度的首页效果一样的背景图(代码)...
  9. .Net/C#分库分表高性能O(1)瀑布流分页
  10. 这可能就是写代码的乐趣吧,你,也一定会爱上写代码的!
  11. [译]SQL SERVER 2016 – Temporal Tables
  12. ubuntu eclipse java_搭建Ubuntu Java Eclipse开发环境
  13. python pso_利用python实现PSO算法优化二元函数
  14. mingw编译boost中bjam的toolset问题
  15. 20211027:《Labuladong的算法小抄》学习记录(一)
  16. ubuntu 安装 mysql debug_ubuntu 安装phpstorm+xdebug 动态调试环境
  17. 拓端tecdat|R语言极值分析:分块极大值Block-maxima、阈值超额法threshold excess、广义帕累托分布GPD拟合降水数据时间序列
  18. Asp.Net学习之-母板
  19. atitit.事件驱动的总结attilax
  20. 嗨,你真的懂this吗?bianji

热门文章

  1. “阿里技术Leader拿那么多钱,每天都干些啥?”带50多人团队,我总结了14点体会!...
  2. 虚拟内存管理加拓展(全网最细)
  3. 计算机系统概论问题进制黑箱问题
  4. 框架梳理|企业大数据管理之道
  5. Python-for循环语句
  6. linux如何卸载glew,在ubuntu下面安装glew
  7. 本地计算机用户管理,管理本地用户与组账户
  8. html表头固定原理,表头固定(利用jquery实现原理介绍)
  9. dev、test、prod是什么?
  10. 人物专访 | 卢秉恒:在太空建一座3D打印工厂