搜档网
当前位置:搜档网 › 解析TS流PAT和PMT 代码

解析TS流PAT和PMT 代码

解析TS流PAT和PMT 代码
解析TS流PAT和PMT 代码

#include

#include

#include

#define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS文件的绝对路径

void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读一个TS流的packet

int parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的table

void parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数目和PMT的PID

void pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的table

void parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PID

void printf_program_list(); //打印PMT table中包含的stream的类型和PID

unsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的table

typedef struct

{

unsigned short program_num; //program's num

unsigned short pmt_pid; //

}PROGRAM;

typedef struct

{

unsigned char stream_type;

unsigned short elementary_pid;

}PRO_LIST;

PROGRAM programs[10] = {{0,0}}; //用来存储PMT的PID和数量unsigned int num = 0; //total program

PRO_LIST program_list[10] = {{0,0}}; //用来存储PMT中stream的类型和PID

unsigned int program_list_num = 0;

FILE *file_handle; //指向TS流的指针

unsigned int FileSize = 0;

int main()

{

unsigned char buffer[188] = {0};

unsigned char *pmt_buffer, *Video_or_Audio_buffer;

unsigned int i=0,j=0,ret=0;

pmt_buffer = (unsigned char*)malloc(sizeof(char)*188); //给buffer分配空间

memset(pmt_buffer,0,sizeof(char)*188);

//清空buffer

Video_or_Audio_buffer = (unsigned char*)malloc(sizeof(char)*188);

memset(Video_or_Audio_buffer,0,sizeof(char)*188);

file_handle = fopen(ts_path,"rb+"); //以二进制方式打开TS文件

if(NULL == file_handle) //判断是否打开文件

{

perror("fopen");

printf("open file error!\n");

return 0;

}

else

printf("open file success!\n");

fseek(file_handle,0,SEEK_END); //指针file_handle将以SEEK_END位置偏移0个位置,即将指针移动到文件尾

FileSize = ftell(file_handle); // 计算file_handle到文件头的偏移字节数,即计算文件的大小

printf("file size = %d\n",FileSize);

rewind(file_handle); // equivalent (void) feek(file_handle,0L,SEEK_SET) 将file_handle 指针移动到文件头位置

printf("find PAT begin-------->\n");

for(i=0;i

{

Read_Ts_Packet(file_handle,buffer,188); //读TS的packet函数,每次读188个字节到buffer

ret = parse_TS(buffer,188); //解析188个字节的

TS's packet,并打印找到的PA T’s table。如果解析成功即找到PA T,则返回1,否则返回0

if(ret == 1)

{

break;

}

else

{

printf("There is no PAT table!\n");

}

}

if(ret == 1)

{

parse_PAT(buffer,188); //解析PAT,并找出所含频道的数目和PMT的PID }

pronum_pmtid_printf(); //打印PMT的PID

rewind(file_handle);

printf("find PMT begin -------->\n");

for(i=0;i

{

pmt_buffer = Find_PMT(programs[i].pmt_pid); //根据PMT的PID找到PMT's table

printf("PMT table -------->\n");

for(j=0;j<188;j++)

{

printf("0x%x ",pmt_buffer[j]); //打印PMT

}

if(pmt_buffer)

{

parse_PMT(pmt_buffer,188,programs[i].pmt_pid); //解析找到的PMT,得到Video、Audio等的PID

}

memset(pmt_buffer,0,sizeof(char)*188);

printf("\n");

}

printf_program_list(); //打印elementary 流的PID和type。

rewind(file_handle);

printf("find Audio and Video begin-------->\n");

for(i=0;i

{

Video_or_Audio_buffer = Find_video_audio(program_list[i].elementary_pid,

program_list[i].stream_type); //根据PID找到elementary流

printf("the program's PID is 0x%x\n",program_list[i].elementary_pid);

printf("the program's Table --------->\n");

for(j=0;j<188;j++)

{

printf("0x%x ",Video_or_Audio_buffer[j]); //打印elementary's table }

memset(Video_or_Audio_buffer,0,sizeof(char)*188);

printf("\n");

}

free(pmt_buffer);

free(Video_or_Audio_buffer);

pmt_buffer = NULL;

Video_or_Audio_buffer = NULL;

fclose(file_handle);

printf("\n");

return 1;

}

/**************************************************

* read one TS packet's data

* *************************************************/

void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len)

{

fread(packet_buf,188,1,file_handle);

}

int parse_TS(unsigned char *buffer,int FileSize)

{

unsigned char *temp = buffer;

short pat_pid;

int i = 0;

if(buffer[0] != 0x47)

{

printf("it's not a ts packet!\n");

return 0;

}

while(temp < buffer + FileSize)

{

pat_pid = (temp[1] & 0x1f)<<8 | temp[2];

if(pat_pid != 0)

printf("finding PAT table ....\n");

else

{

printf("already find the PA T table\n");

printf("pat_pid = 0x%x\n",pat_pid);

printf("pat table ------->\n");

for(i=0;i<=187;i++)

{

printf("0x%x ",buffer[i]);

}

printf("\n");

return 1;

}

temp = temp + 188;

}

return 0;

}

/*******************************************************

* parse PAT table, get the PMT's PID

* ********************************************************/ void parse_PAT(unsigned char *buffer,int len)

{

unsigned char *temp, *p;

char adaptation_control;

int adaptation_length,i=0;

unsigned short section_length,prg_No,PMT_Pid;

temp = buffer;

adaptation_control = temp[3] & 0x30;

if(adaptation_control == 0x10)

temp = buffer + 4 + 1;

else if (adaptation_control == 0x30)

{

adaptation_length = buffer[4];

temp = buffer + 4 + 1 +adaptation_length + 1; }

else

{

return ;

}

section_length = (temp[1]&0x0f)<<8 | temp[2];

p = temp + 1 +section_length;

temp = temp + 8;

while(temp < p - 4)

{

prg_No = (temp[0]<<8) | (temp[1]);

if(prg_No == 0)

{

temp = temp + 4;

continue;

}

else

{

PMT_Pid = (temp[2]&0x1f)<<8 | temp[3];

programs[num].program_num = prg_No;

programs[num].pmt_pid = PMT_Pid;

// printf("pmt_pid is ox%x\n", PMT_Pid);

num ++;

temp = temp + 4;

}

}

}

void pronum_pmtid_printf()

{

unsigned int i;

printf("PAT table's program_num and PMT's PID:\n");

for(i=0;i

{

printf("program_num = 0x%x (%d),PMT_Pid = 0x%x (%d)\n",

programs[i].program_num,programs[i].program_num,

programs[i].pmt_pid,programs[i].pmt_pid);

}

}

void printf_program_list()

{

unsigned int i;

printf("All PMT Table's program list: \n");

for(i=0;i

{

printf("stream_type = 0x%x, elementary_pid = 0x%x\n",program_list[i].stream_type,program_list[i].elementary_pid);

}

printf("\n");

}

unsigned char* Find_PMT(unsigned short pmt_pid)

{

unsigned int i=0,j=0;

int pid;

unsigned char *buffer;

buffer = (unsigned char *)malloc(sizeof(char)*188);

memset(buffer,0,sizeof(char)*188);

rewind(file_handle);

for(j=0;j

{

Read_Ts_Packet(file_handle,buffer,188);

if(buffer[0] != 0x47)

{

printf("It's not TS packet !\n");

}

else

{

pid = (buffer[1] & 0x1f)<< 8 | buffer[2];

if(pid == pmt_pid)

{

printf("PMT Table already find!\n");

return buffer;

}

else

printf("finding PMT table.......\n");

}

}

}

unsigned char* Find_video_audio(unsigned short program_pid,unsigned char type) {

unsigned int i = 0, j = 0 ;

int pid;

unsigned char *buffer;

buffer = (unsigned char *)malloc(sizeof(char)*188);

memset(buffer,0,sizeof(char)*188);

rewind(file_handle);

for(j=0;j

{

Read_Ts_Packet(file_handle,buffer,188);

if(buffer[0] != 0x47)

{

printf("It's not TS packet !\n");

}

else

{

pid = (buffer[1] & 0x1f)<< 8 | buffer[2];

if(program_pid == pid)

{

if(type == 0x02)

printf("Find a program and this program is Video type!\n");

else if(type == 0x03)

printf("Find a program and this program is Audio type!\n");

else

printf("Find a program but this program is other type !\n");

return buffer;

}

else

printf("finding Video or Audio table.....\n ");

}

}

}

void parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid)

{

unsigned char *temp, *p;

char adaptation_control;

int adaptation_length,i=0;

int program_info_length;

int ES_info_length;

unsigned short section_length,pid;

temp = buffer;

adaptation_control = temp[3] & 0x30;

if(adaptation_control == 0x10)

{

temp = buffer + 4 +1;

}

else if (adaptation_control == 0x30)

{

adaptation_length = buffer[4];

temp = buffer + 5 + adaptation_length + 1;

}

else

return;

section_length = (temp[1]&0x0f)<<8 | temp[2];

p = temp + 1 + section_length;

// temp = temp + 10;

program_info_length = (temp[10] & 0x0f) << 8 | temp[11];

temp = temp + 12 + program_info_length ;

for(;temp < p - 4;)

{

program_list[program_list_num].stream_type = temp[0],

program_list[program_list_num].elementary_pid = (temp[1]&0x1f) << 8 | temp[2];

ES_info_length = (temp[3]&0x0f) << 8 | temp[4];

temp = temp + 4 + ES_info_length + 1;

program_list_num ++ ;

}

}

wireshark分析tcp协议

WireShark分析TCP协议 韩承昊3172700 摘要: 利用wireshark分析TCP协议的报文,和其基本行为,包括三 次握手,中间信息的交互,和最后的断开连接。其中通过中间信息的交互,可以看出TCP的累积式确认。 一:基本TCP报文分析 我们来看一个简单的TCP报文,现在蓝字选中的是源端口号,

我们可以看到在这个报文中是14065,下面对应的是相应的二进制代码,我们可以看到的确是16bit。紧随其后的16bit就是目的端口号。 下面是序号,Sequence number: 1169。接下来的32bit是确认号,Acknowledgement number: 19353。再后面是首部长度,Header length: 20 bytes,和未用的3bit数据。 0= Urgent:Not set,1=Acknowledgement: set,0= Push:Not set,0= Reset:Not set,0= Syn:Not set,0= Fin:Not set,这些表示的是一些标识位,是URG紧急标识,ACK确认标识,PSH推送标识,RST、SYN、FIN用于建立和结束连接。window size value:65535 表示接收窗口。 二:三次握手分析 三次握手的第一步,客户机端会向服务器端发送一个特殊的TCP报文段,这个报文段的SYN被置为1,并会发送一个起始序号seq。

我们看到SYN为1,且Sequence number=0,这样,面对这样的请求报文段,服务器听该返回一个SYN=1,返回自己的初始seq,并且要求主机发送下一个报文段的序号,ack=1。下面是服务端实际返回的报文。 正如我们所期待的那样,服务器返回了自己的seq=0,并且要求主机端发送下一个报文段,并且SYN=1。这样主机端就应该返回seq=1,ack=1,要求服务端发送下一个报文,并且SYN=0,结束建立连接阶段,结束三次握手。

解析TS流PAT和PMT 代码

#include #include #include #define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS文件的绝对路径 void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读一个TS流的packet int parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的table void parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数目和PMT的PID void pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的table void parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PID void printf_program_list(); //打印PMT table中包含的stream的类型和PID unsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的table typedef struct { unsigned short program_num; //program's num unsigned short pmt_pid; // }PROGRAM; typedef struct { unsigned char stream_type; unsigned short elementary_pid; }PRO_LIST; PROGRAM programs[10] = {{0,0}}; //用来存储PMT的PID和数量unsigned int num = 0; //total program PRO_LIST program_list[10] = {{0,0}}; //用来存储PMT中stream的类型和PID unsigned int program_list_num = 0; FILE *file_handle; //指向TS流的指针 unsigned int FileSize = 0;

ts流解析规则

HLS,Http Live Streaming是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP 协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列标签组成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./1.ts #EXTM3U:每个M3U8文件第一行必须是这个tag。 #EXT-X-TARGETDURATION:指定最大的媒体段时间长度(秒),#EXTINF中指定的时间长度必须小于或等于这个最大值。该值只能出现一次。 #EXTINF:描述单个媒体文件的长度。后面为媒体文件,如./0.ts 2、ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

注:详解如下 (1)ts层ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。ts header固定4个字节;adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes 数据。 ts header

计算机网络课程设计---基于Wireshark的网络数据包内容解析

基于Wireshark的网络数据包内容解析 摘要本课程设计是利用抓包软件Wireshark,对网络服务器与客户端进行网络数据收发过程中产生的包进行抓取,然后对所抓取的包进行分析,并结合的协议进行分析,达到了解各种数据包结构的目的。设计过程中对各种包进行抓取分析,各种包之间比较,了解每种包的传输过程与结构,通过本次课程设计,能很好的运用Wireshark对数据包分析和Wireshark各种运用,达到课程设计的目的。 关键词IP协议;TCP协议;UDP协议;ARP协议;Wireshark;计算机网络; 1 引言 本课程设计主要是设计一个基于Wireshark的网络数据包内容解析,抓取数据包,然后对所抓取的包进行分析,并结合的协议进行分析,达到了解各种数据包结构的目的 1.1 课程设计目的 Wireshark是一个网络封包分析软件。可以对网络中各种网络数据包进行抓取,并尽可能显示出最为详细的网络封包资料,计算机网络课程设计是在学习了计算机网络相关理论后,进行综合训练课程,其目的是: 1.了解并会初步使用Wireshark,能在所用电脑上进行抓包; 2.了解IP数据包格式,能应用该软件分析数据包格式。 1.2 课程设计要求 (1)按要求编写课程设计报告书,能正确阐述设计结果。 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。 (3)学会文献检索的基本方法和综合运用文献的能力。

(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 1.3 课程设计背景 一、Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。 网络封包分析软件的功能可想像成 "电工技师使用电表来量测电流、电压、电阻" 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。在过去,网络封包分析软件是非常昂贵,或是专门属于营利用的软件。Wireshark的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Wireshark是目前全世界最广泛的网络封包分析软件之一。 二、网络嗅探需要用到网络嗅探器,其最早是为网络管理人员配备的工具,有了嗅探器网络管理员可以随时掌握网络的实际情况,查找网络漏洞和检测网络性能,当网络性能急剧下降的时候,可以通过嗅探器分析网络流量,找出网络阻塞的来源。网络嗅探是网络监控系统的实现基础。 网络嗅探需要用到网络嗅探器,其最早是为网络管理人员配备的工具,有了嗅探器网络管理员可以随时掌握网络的实际情况,查找网络漏洞和检测网络性能,当网络性能急剧下降的时候,可以通过嗅探器分析网络流量,找出网络阻塞的来源。嗅探器也是很多程序人员在编写网络程序时抓包测试的工具,因为我们知道网络程序都是以数据包的形式在网络中进行传输的,因此难免有协议头定义不对的。 网络嗅探的基础是数据捕获,网络嗅探系统是并接在网络中来实现对于数据的捕获的,这种方式和入侵检测系统相同,因此被称为网络嗅探。网络嗅探是网络监控系统的实现基础,首先就来详细地介绍一下网络嗅探技术,接下来就其在网络监控系统的运用进行阐述。 2 网络协议基础知识 2.1 IP协议 (1) IP协议介绍

PSI SI解析(各种id说明)

[转载]PSI/SI解析(各种id说明) (2012-06-13 17:14:16) 转载▼ 分类:计算机 标签: 转载 原文地址:PSI/SI解析(各种id说明)作者:阿猛 一、SI信息的构成 1、信息构成 SI信息内容是按照network(网络)→transport strem(传输流)→service(业务)→event(事件)的分层顺序描述,如图1所示。 SI数据信息是按照一定的数据结构进行存储的,这样一来才能达到方便、快捷地进行数据检索和提取。SI数据主要有:网络信息、传输流信息、业务信息、业务的事件信息等,并且大量的信息都是通过描述符来传输的,所以可用树状链表来存储数据,构成从网络、传输流、业务、事件的树状结构。机顶盒接收端的解析主要负责这些SI数据的重建。 在数字电视系统中,为了能有效地从众多的数据包中组织起SI信息,而使用了很多的标识。有Network_id(网络标识)、Original_network_id(原始网络标识)、Transport_stream_id(传输流标识)、Service id(业务标识)、eventid_id(事件标识)、Bouquet_id(业务群组标识)。这些标识是作为信息查找定位用的,例如:要在一个TS里找出一个业务信息,就要知道这个业务信息在那个网络里、在哪个TS里和这个业务信息在这个流里的标识,这样一来,通过层层过滤,就能精确地定位描述这个业务信息的位置,并把它们找出来进行数据组织。图1就非常清楚地表明了这种查找思路。 一个网络信息由network_id来定位。

一个TS由network_id、Original_network_id、Transport_stream_id来定位,标明这个流在那个网络播发,它原属那个网络,并给它加上标识。 一个业务由network_id、Original_network_id、Transport_stream_id、service_id来定位,标明这个业务在那个网络播发,它原属那个网络和那个流,并给它加上标识。这体现在SDT表中。 一个事件由network_id、Original_network_id、Transport_stream_id、service_id、event_id来定位,标明这个事件在那个网络播发,它原属那个网络和那个流及那个业务,并给它加上标识。这体现在EIT表中。 据此,根据各个SI表的功能,各表的ID结构如下: NIT:network_id、Original_network_id、Transport_stream_id 、service_id。 SDT:Original_network_id、Transport_stream_id 、service_id。 EIT:Original_network_id、Transport_stream_id 、service_id、event_id。 BAT:bouquet_id 、Original_network_id 、Transport_stream_id 、service_id。 另外,还有一个PID(包标识),它的作用是给每一个数据包打上一个标记,TS承载有视频数据、音频数据、PSI和SI信息数据、图文电视数据、字幕数据、数据广播数据、交互业务数据、CA系统的控制信息数据等等,除了PSI和SI信息数据和CA系统的控制信息数据外,其他的数据的PID都是通过PMT表给出的,CA系统的控制信息数据的PID是由CAT表给出的,而承载了PSI和SI信息的各种表的PID值是固定分配的。 如下表 表 PID值 PAT | 0X0000 CAT | 0X0001 TSDT | 0X0002 NIT、ST | 0X0010 SDT、BAT、ST | 0X0011 EIT、ST | 0X0012 RST、ST | 0X0013 TDT、TOT、ST | 0X0014 DIT | 0X001E SIT | 0X001F 由于这些表是分配了固定的PID值,所以机顶盒就可以根据这些PID值来辨认出是什么表,并读取表中的描述参数来生成EPG信息和完成各种数据的组织、解码出所需要的节目和信息。 2、表的构成

TS流结构分析(PAT和PMT)

TS流也是由一个或多个PES组合而来的,他们可以具有相同的时间基准,也可以不同。其基本的复用思想是,对具有相同时间基准[color="#000000"]的多个PES现进行节目复用,然后再对相互有独立时间基准的各个PS进行传输复用,最终产生出TS。TS包由包头和包数据2部分组成,其中包头还可以包括扩展的自适用区。包头长度占4bytes,自使用区和包数据共占184bytes,整个TS包长度相当于4个ATM包长。TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。 其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包内容是否加扰,但包头和自适应区永远不加扰;自适应区控制,用2 bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;连续计数器可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。显然,包头对TS包具有同步、识别、检错及加密功能。 TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也

Wireshark使用教程详解,带实例

Wireshark教程带实例 第 1 章介绍 1.1. 什么是Wireshark Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级) 过去的此类工具要么是过于昂贵,要么是属于某人私有,或者是二者兼顾。 Wireshark出现以后,这种现状得以改变。Wireshark可能算得上是今天能使用的最好的开元网络分析软件。 1.1.1. 主要应用 下面是Wireshark一些应用的举例: ?网络管理员用来解决网络问题 ?网络安全工程师用来检测安全隐患 ?开发人员用来测试协议执行情况 ?用来学习网络协议 除了上面提到的,Wireshark还可以用在其它许多场合。 1.1. 2. 特性 ?支持UNIX和Windows平台 ?在接口实时捕捉包 ?能详细显示包的详细协议信息 ?可以打开/保存捕捉的包 ?可以导入导出其他捕捉程序支持的包数据格式 ?可以通过多种方式过滤包 ?多种方式查找包 ?通过过滤以多种色彩显示包 ?创建多种统计分析 ?…还有许多 不管怎么说,要想真正了解它的强大,您还得使用它才行

图 1.1. Wireshark捕捉包并允许您检视其内 1.1.3. 捕捉多种网络接口 Wireshark 可以捕捉多种网络接口类型的包,哪怕是无线局域网接口。想了解支持的所有网络接口类型,可以在我们的网站上找到https://www.sodocs.net/doc/9d15468451.html,/CaptureSetup/NetworkMedia. 1.1.4. 支持多种其它程序捕捉的文件 Wireshark可以打开多种网络分析软件捕捉的包,详见??? 1.1.5. 支持多格式输出 Wieshark可以将捕捉文件输出为多种其他捕捉软件支持的格式,详见??? 1.1.6. 对多种协议解码提供支持 可以支持许多协议的解码(在Wireshark中可能被称为解剖)??? 1.1.7. 开源软件 Wireshark是开源软件项目,用GPL协议发行。您可以免费在任意数量的机器上使用它,不用担心授权和付费问题,所有的源代码在GPL框架下都可以免费使用。因为以上原因,人们可以很容易在Wireshark上添加新的协议,或者将其作为插件整合到您的程序里,这种应用十分广泛。 1.1.8. Wireshark不能做的事 Wireshark不能提供如下功能 ?Wireshark不是入侵检测系统。如果他/她在您的网络做了一些他/她们不被允许的奇怪的事情,Wireshark不会警告您。但是如果发生了奇怪的事情,Wireshark可能对察看发生了什么会有所帮助。[3]?Wireshark不会处理网络事务,它仅仅是“测量”(监视)网络。Wireshark不会发送网络包或做其它交互性的事情(名称解析除外,但您也可以禁止解析)。 1.2. 系通需求

TS流信息描述2

transport stream MPEG组织于1994年推出MPEG-2压缩标准,以实现视/音频服务与应用互操作的可能性,MPEG-2标准是针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定。对应于不同的应用,符合MPEG-2标准的码流又分为传送流和程序流,本文主要讲解了传送流有关的部分数据结构,从实际应用的传送流码流中截取了部分码流做了说明,并给出了部分解析传送流码流的实例程序。 在MPEG-II标准中,为了将一个或更多的音频、视频或其他的基本数据流合成单个或多个数据流,以适应于存储和传送,必须对其重新进行打包编码,在码流中还需插入各种时间标记、系统控制等信息,最后送到信道编码与调制器。这样可以形成两种数据流——传送流(TS)和程序流(PS),分别适用于不同的应用,图1给出了单路节目的视音频数据流的复用框图。 传送流(Transport Stream)简称TS流,它是根据ITU-T Rec.H.222.0|ISO/IEC 13818-2 和ISO/IEC 13818-3协议而定义的一种数据流,其目的是为了在有可能发生严重错误的情况下进行一道或多道程序编码数据的传送和存储。这种错误表现为比特值错误或分组丢失。传送流由一道或多道节目组成,每道节目由一个或多个原始流和一些其他流复合在一起,包括视频流、音频流、节目特殊信息流(PSI)和其他数据包。其中PSI表有4种类型:节目关联表(PAT)、节目映射表(PMT)、网络信息表和条件访问表。传送流应用比较广泛,如视音频资料的保存、电视节目的非线性编辑系统及其网络等。在开发机顶盒以及视频设备时有时需要对码流的编码知识有比较清楚地了解,这样才能在遇到问题时做出全面的分析。 TS流结构分析 如图2所示,TS包的长度是固定的,为188字节。包括同步字节(sync_byte)0x47和数据包识别号PID等。PID为13位字段,指示存储于分组有效负载中数据的类型,PID值0x0000为程序关联表保留,而0x0001为条件访问表保留,0x1FFF为空分组保留。从PID可以判断其后面负载的数据类型是视频流、音频流、PSI还是其他数据包。 PSI描述说明 在MPEG-II中定义了节目特定信息(PSI),PSI用来描述传送流的组成结构,在MPEG-II系统中担任极其重要的角色,在多路复用中尤为重要的是PAT表和PMT表。PAT表给出了一路MPEG-II码流中有多少套节目,以及它与PMT表PID之间的对应关系;PMT表给出了一套节目的具体组成情况与其视频、音频等PID对应关系。PSI提供了使接收机能够自动配置的信息,用于对复用流中的不同节目流进行解复用和解码。PSI信息由以下几种类型表组成: ◆节目关联表(PAT Program Association Table) PAT表用MPEG指定的PID(00)标明,通常用PID=0表示。它的主要作用是针对复用的每一路传输流,提供传输流中包含哪些节目、节目的编号以及对应节目的节目映射表(PMT)的位置,即PMT的TS包的包标识符(PID)的值,同时还提供网络信息表(NIT)的位置,即NIT 的TS包的包标识符(PID)的值。 ◆条件接收表(CAT Conditional Access Table) CAT表用MPEG指定的PID(01)标明,通常用PID=1表示。它提供了在复用流中条件接收系统的有关信息,指定CA系统与它们相应的授权管理信息(EMM))之间的联系,指定EMM 的PID,以及相关的参数。 ◆节目映射表(PMT Program Map Table) 节目映射表指明该节目包含的内容,即该节目由哪些流组成,这些流的类型(音频、视频、数据),以及组成该节目的流的位置,即对应的TS包的PID值,每路节目的节目时钟参考(PCR)

Wireshark使用教程

第 1 章介绍 1.1. 什么是Wireshark Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级) 过去的此类工具要么是过于昂贵,要么是属于某人私有,或者是二者兼顾。 Wireshark出现以后,这种现状得以改变。Wireshark可能算得上是今天能使用的最好的开元网络分析软件。 1.1.1. 主要应用 下面是Wireshark一些应用的举例: ?网络管理员用来解决网络问题 ?网络安全工程师用来检测安全隐患 ?开发人员用来测试协议执行情况 ?用来学习网络协议 除了上面提到的,Wireshark还可以用在其它许多场合。 1.1. 2. 特性 ?支持UNIX和Windows平台 ?在接口实时捕捉包 ?能详细显示包的详细协议信息 ?可以打开/保存捕捉的包 ?可以导入导出其他捕捉程序支持的包数据格式 ?可以通过多种方式过滤包 ?多种方式查找包 ?通过过滤以多种色彩显示包 ?创建多种统计分析 ?…还有许多 不管怎么说,要想真正了解它的强大,您还得使用它才行 图 1.1. Wireshark捕捉包并允许您检视其内

1.1.3. 捕捉多种网络接口 Wireshark 可以捕捉多种网络接口类型的包,哪怕是无线局域网接口。想了解支持的所有网络接口类型,可以在我们的网站上找到https://www.sodocs.net/doc/9d15468451.html,/CaptureSetup/NetworkMedia. 1.1.4. 支持多种其它程序捕捉的文件 Wireshark可以打开多种网络分析软件捕捉的包,详见??? 1.1.5. 支持多格式输出 Wieshark可以将捕捉文件输出为多种其他捕捉软件支持的格式,详见??? 1.1.6. 对多种协议解码提供支持 可以支持许多协议的解码(在Wireshark中可能被称为解剖)??? 1.1.7. 开源软件 Wireshark是开源软件项目,用GPL协议发行。您可以免费在任意数量的机器上使用它,不用担心授权和付费问题,所有的源代码在GPL框架下都可以免费使用。因为以上原因,人们可以很容易在Wireshark上添加新的协议,或者将其作为插件整合到您的程序里,这种应用十分广泛。 1.1.8. Wireshark不能做的事 Wireshark不能提供如下功能 ?Wireshark不是入侵检测系统。如果他/她在您的网络做了一些他/她们不被允许的奇怪的事情,Wireshark不会警告您。但是如果发生了奇怪的事情,Wireshark可能对察看发生了什么会有所帮助。[3]?Wireshark不会处理网络事务,它仅仅是“测量”(监视)网络。Wireshark不会发送网络包或做其它交互性的事情(名称解析除外,但您也可以禁止解析)。 1.2. 系通需求 想要安装运行Wireshark需要具备的软硬件条件... 1.2.1. 一般说明 ?给出的值只是最小需求,在大多数网络中可以正常使用,但不排除某些情况下不能使用。[4] ?在繁忙的网络中捕捉包将很容塞满您的硬盘!举个简单的例子:在100MBIT/s全双工以太网中捕捉数据将会产生750MByties/min的数据!在此类网络中拥有高速的CPU,大量的内存和足够的磁盘空间是十分有必要的。 ?如果Wireshark运行时内存不足将会导致异常终止。可以在 https://www.sodocs.net/doc/9d15468451.html,/KnownBugs/OutOfMemory察看详细介绍以及解决办法。 ?Wireshark作为对处理器时间敏感任务,在多处理器/多线程系统环境工作不会比单独处理器有更快的速度,例如过滤包就是在一个处理器下线程运行,除了以下情况例外:在捕捉包时“实时更新包列表”,此时捕捉包将会运行在一个处理下,显示包将会运行在另一个处理器下。此时多处理或许会有所帮助。[5] 1.2.2. Microsoft Windows ?Windows 2000,XP Home版,XP Pro版,XP Tablet PC,XP Media Center, Server 2003 or Vista(推荐在XP下使用) ?32-bit奔腾处理器或同等规格的处理器(建议频率:400MHz或更高),64-bit处理器在WoW64仿真环境下-见一般说明 ?128MB系统内存(建议256Mbytes或更高) ?75MB可用磁盘空间(如果想保存捕捉文件,需要更多空间) 800*600(建议1280*1024或更高)分辨率最少65536(16bit)色,(256色旧设备安装时需要选择”legacy GTK1”) ?网卡需求: o以太网:windows支持的任何以太网卡都可以 o无线局域网卡:见MicroLogix support list, 不捕捉802.11包头和无数据桢。 o其它接口见:https://www.sodocs.net/doc/9d15468451.html,/CaptureSetup/NetworkMedia

pat表和各个表的关系

专用信息(PSI) PSI 承载于含特定PID 的数据包之中。PSI已被标准化了,而有些内容则由节目关联表(PAT)和有条件进入表(CAT)来规定。这些数据包必须周期地包含在每个传输流中。PAT的PID总是为0,而CAT的PID总是为1。这些PID 值和零数据包PID的8191值是整个MPEG系统中唯一的固定PID 值。解多路复接器必须通过进入合适的表来确定所有余下的PID。然而,在ATSC和DVB中PMT可能要求特定的PID值。从这方面( 和其它一些方面) 来看,MPEG和DVB/ATSC是不能完全互相转换的。节目关联表(PAT)数据包(PID=0)中列出了传输流中存在的节目流,PAT 指定了所有节目映像表(PMT)数据包的PID。PAT的第一条输入,即节目0,总是留给网络数据,包含了网络信息(NIT)数据包的PID。授权控制信息(ECM) 的PID 和授权管理信息(EMM)的PID列在有条件进入表(CA T)数据包(PID=1)中。图7.3 显示,属于同一节目流的视频、音频和数据基本数据流的PID都列在节目映像表(PMT) 数据包中。每个PMT 数据包有其自己的PID。一个给定网络信息表包含的内容不仅仅是承载它的传输流,还包括同一解码器所能获得的其它传输流,例如调到不同的RF频道,或将卫星接收天线对准其它不同的卫星。NIT 可能列出一些其它传输流数目,每个含有一个描述符,指定无线电频率、轨道位置等等。在MPEG中只有NIT 是强制性设定的。在DVB中还包括如DVB-SI那样的中间数据,而NIT 则被认为是DVBSI的一部分。该内容将在第八部分中讨论。在一般讨论时,我们使用PSI/SI 这个词。 当第一次接收到传输流时,解多路复接器必须在数据包报头中寻找0和1 的PID。所有PID0 数据包含有节目关联表(PAT)。所有PID1 数据包含有有条件进入表(CAT)数据。通过读取PAT,解多路复接器可以找到网络信息表(NIT)和每个节目映像表(PMT) 中的 PID 。找到了PMT,解多路复接器便可找到每个基本数据流的PID。因此,如果要解码一个特定的节目流,我们就先要参考PA T,然后只需要PMT 来寻找节目中所有的基本数据流的PID。如果节目被加密,则还需要进入CAT。由于没有PAT就无法进行介多路复接,所以搜寻速度是PAT 数据包发送频率的函数。MPEG规定PAT数据包和参考PAT 数据包的PMT 数据包之间的最大间隔为0.5秒。在DVB和ATSC中,NIT 可能存在于具有特定PID 的数据包中。 第五部分 打包基本数据流(PES) 在实际应用中,载有从压缩器中得到的视频或音频的连续基本数据流需要分割成数据包。这些数据包用含有同步时间标记的报头信息来辨别。PES 数据包能够用来创建节目流或传输流。 5.1 PES 数据包 在打包基本数据流(PES)中,无长度限制的基本数据流根据不同的应用场合分割成大小合适的数据包。数据包的大小可能是几百个千字节,但它会根据不同的应用场合而变化。每个数据包之前有一个PES数据包报头。图5.1 显示的是报头信息内容。数据包的开头是一个24位的开始码前缀和一个数据流ID,用来识别数据包的内容是视频还是音频,并进一步识别音频编码的类型。这两个参数(开始码前缀和数据流ID)组成了数据包开始码,用来识别数据包的开始。请不要将PES中的数据包和传输流中使用的小得多的数据包混淆起来,即便它们有着相同的名字。由于MPEG只定义了传输流,而没有定义编码器,所以设计者要选择建立多路复接器,进一步将基本数据流转变成传输流。在这种情况下,PES 数据包可能没法识别,但它们在逻辑上存在于传输流有效负载之中。 5.2 时间标记

实验六利用Wireshark分析协议HTTP

实验六利用W i r e s h a r k分析协议H T T P 一、实验目的 分析HTTP协议 二、实验环境 与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。 三、实验步骤 1、利用Wireshark俘获HTTP分组 (1)在进行跟踪之前,我们首先清空Web 浏览器的高速缓存来确保Web网页是从网络中获取的,而不是从高速缓冲中取得的。之后,还要在客户端清空DNS高速缓存,来确保Web服务器域名到IP地址的映射是从网络中请求。在WindowsXP机器上,可在命令提示行输入ipconfig/flushdns(清除DNS解析程序缓存)完成操作。 (2)启动Wireshark 分组俘获器。 (3)在Web 浏览器中输入:https://www.sodocs.net/doc/9d15468451.html, (4)停止分组俘获。 图1.1 利用Wireshark俘获的HTTP分组 在URL https://www.sodocs.net/doc/9d15468451.html,中,https://www.sodocs.net/doc/9d15468451.html,是一个具体的web 服务器的域名。最前面有两个DNS分组。第一个分组是将域名https://www.sodocs.net/doc/9d15468451.html,

转换成为对应的IP 地址的请求,第二个分组包含了转换的结果。这个转换是必要的,因为网络层协议——IP协议,是通过点分十进制来表示因特网主机的,而不是通过https://www.sodocs.net/doc/9d15468451.html,这样的域名。当输入URL http://https://www.sodocs.net/doc/9d15468451.html, 时,将要求Web服务器从主机https://www.sodocs.net/doc/9d15468451.html,上请求数据,但首先Web浏览器必须确定这个主机的IP地址。 随着转换的完成,Web浏览器与Web服务器建立一个TCP连接。最后,Web 浏览器使用已建立好的TCP连接来发送请求“GET/HTTP/1.1”。这个分组描述了要求的行为(“GET”)及文件(只写“/”是因为我们没有指定额外的文件名),还有所用到的协议的版本(“HTTP/1.1”)。 2、HTTP GET/response交互 (1)在协议框中,选择“GET/HTTP/1.1” 所在的分组会看到这个基本请求行后跟随着一系列额外的请求首部。在首部后的“\r\n”表示一个回车和换行,以此将该首部与下一个首部隔开。 “Host”首部在HTTP1.1版本中是必须的,它描述了URL中机器的域名,本例中是https://www.sodocs.net/doc/9d15468451.html,。这就允许了一个Web服务器在同一时间支持许多不同的域名。有了这个数不,Web服务器就可以区别客户试图连接哪一个Web服务器,并对每个客户响应不同的内容,这就是HTTP1.0到1.1版本的主要变化。 User-Agent首部描述了提出请求的Web浏览器及客户机器。 接下来是一系列的Accpet首部,包括Accept(接受)、Accept-Language (接受语言)、Accept-Encoding(接受编码)、Accept-Charset(接受字符集)。它们告诉Web服务器客户Web浏览器准备处理的数据类型。Web服务器可以将数据转变为不同的语言和格式。这些首部表明了客户的能力和偏好。 Keep-Alive及Connection首部描述了有关TCP连接的信息,通过此连接发送HTTP请求和响应。它表明在发送请求之后连接是否保持活动状态及保持多久。大多数HTTP1.1连接是持久的(persistent),意思是在每次请求后不关闭TCP 连接,而是保持该连接以接受从同一台服务器发来的多个请求。 (2)我们已经察看了由Web浏览器发送的请求,现在我们来观察Web服务器的回答。响应首先发送“HTTP/1.1 200 ok”,指明它开始使用HTTP1.1版本来发送网页。同样,在响应分组中,它后面也跟随着一些首部。最后,被请求的实际数据被发送。

编解码流程

目录 1 编解码流程 (2) 1.1 编码流程 (2) 1.2 PES、TS结构 (3) PES结构分析(ES打包成PES) (3) TS结构:(PES经复用器打包成TS): (4) 2 解码流程 (5) 2.1 获取TS中的PAT (5) 2.2 获取TS中的PMT (6) 2.3 分流过滤 (6) 2.4 解码 (7) 3 DVB和ATSC制式 (7) 3.1 DVB和ATSC的区别 (7) 3.2 DVB和ATSC的SI (8)

1编解码流程 1.1编码流程 图1-1 ES:原始码流,包含视频、音频或数据的连续码流。 PES:打包生成的基本码流,是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流,可以是不连续的。 TS:传输流,是由固定长度为188字节的包组成,含有独立时基的一个或多个节目,适用于误码较多的环境。 PS:节目流. TS流与PS流的区别在于TS流的包结构是固定长度的,而PS 流的包结构是可变长度的。在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。TS码流具有较强的抵抗传输误码的能力。

最后经过64QAM调制及上变频形成射频信号在HFC网中传输,在用户终端经解码恢复模拟音视频信号。 1.2PES、TS结构 PES结构分析(ES打包成PES) ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码数据流的统称。每个ES都由若干个存取单元(AU)组成,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。 ES流经过PES打包器之后,被转换成PES包。PES包由包头和payload组成。 打包时,加入显示时间标签(Presentation Time-Stamp,PTS),解码时间标签(Decoding Time-Stamp,DTS)及段内信息类型等标志信

ts流解析规则

HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP 协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列标签组成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./1.ts #EXTM3U:每个M3U8文件第一行必须是这个tag。 #EXT-X-TARGETDURATION:指定最大的媒体段时间长度(秒),#EXTINF中指定的时间长度必须小于或等于这个最大值。该值只能出现一次。 #EXTINF:描述单个媒体文件的长度。后面为媒体文件,如./0.ts 2、ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

注:详解如下 (1)ts层 ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。ts header固定4个字节;adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes数据。 ts header sync_byte 8b 同步字节,固定为0x47 transport_error_indicator 1b 传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常都为0,这个字节算在adapt域长度内 payload_unit_start_indicator 1b 负载单元起始标示符,一个完整的数据包开始时标记为1 transport_priority 1b 传输优先级,0为低优先级,1为高优先级,通常取

wireshark分析HTTP

利用Wireshark分析协议HTTP 一、实验目的 分析HTTP协议 二、实验环境 与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。 三、实验步骤 3.1课程设计步骤 (1)启动WireShark。 图 3.1 wireshark启动界面 (2)启动PC上的chrome浏览器。

图3.2 启动chrome浏览器 (3) 开始分组捕获:选择“抓包”下拉菜单中的“抓包参数选择”命令,在 WireShark:“抓包选项”窗口中可以设置分组捕获的选项。 (4) 在这次实验中,使用窗口中显示的默认值。选择“抓包”下拉菜单中的 “网络接口”命令,显示计算机中所安装的网络接口(即网卡)。我们需要选择电 脑真实的网卡,点击后显示本机的IP地址。 (5) 随后,点击“开始”则进行分组捕获,所有由选定网卡发送和接收的分 组都将被捕获。 图3.4 抓包选项设置

(6) 待捕获一段时间,关闭浏览器,选择主窗口中有的“stop”按钮,可以停止分组的捕获。 图3.5 结束按钮 3.2 抓包并分析过程 这次实验通过分析打开谷歌主页来分析http协议的作用。 在filter中输入http进行筛选。 wireshark所抓的含有http请求报文的帧: 图3.6 打开谷歌主页抓到的HTTP包 对打开谷歌网页这个事务进行分析:在浏览器中输入谷歌主页地址,敲击回车的过程中,浏览器向DNS请求解析https://www.sodocs.net/doc/9d15468451.html,的IP地址。域名系统DNS 解析出谷歌服务器的IP地址为173.194.72.199在这个过程中本机IP 10.10.22.75。然后浏览器与服务器建立TCP连接(服务器端的IP地址为173.194.72.199,端口是80)。然后浏览器发出取文件命令:GET /webhp?hl=zh-CN&sourceid=cnhp HTTP/1.1\r\n。服务器给出响应把文件(text/html)发送给浏览器,浏览器显示 text/html中的所有文本。浏览器下载网页文本内容,网页文本中标记着图片、CSS 文件和Flash等等。在这次课程设计中谷歌主页还包括谷歌logo图片和其他一些内容,浏览器分析出这些内容后开4个线程对这些内容进行下载,分别向服务器发送请求报文,服务器接收到内容后根据HTTP协议发送响应报文。所有的内容

TS流解析

#include #include using namespace std; struct programs //封装节目信息的结构体 { int programID;//节目编号 int pmtPID;//所属PMT的pid int videoPID;//视频pid int audioPID1;//音频pid int audioPID2;//音频pid }myProg[20]; bool FindAndParsePAT(unsigned char *buffer,int pID,int curPack);//传入BUF和PID的值bool FindAndParsePMT(unsigned char *buffer,int pID,int curPack); int program=0; int prog_count=0; void main() { unsigned char *buffer=new unsigned char[500]; int startPos=0;//第一个TS分组在流中的位置序号 int packageLen=0;//分组长度 int pmtCount=-1;//PMT表序号 int pID=0; int nullpack=0; //0.以二进制方式打开TS文件 ifstream myFile("test.ts",ios::binary|ios::in); //1.读入文件的前500个字节,找同步头、确定包长 myFile.read((char *)buffer,500); for(int i=0;i<500;i++) { //判断有无压缩 if(buffer[i]==0x47&&buffer[i+188]==0x47) { startPos=i;//第一个TS分组在流中的位置序号 packageLen=188;//分组长度 break; } else if(buffer[i]==0x47&&buffer[i+204]==0x47) { startPos=i; packageLen=204; break; } }

相关主题