解析TS流之解析TS包头数据

来源:互联网 发布:json转字符串 编辑:程序博客网 时间:2024/05/11 23:20

解析TS流是一个很复杂的过程,首先需要解析TS包头的数据。这里不将分188字节和204字节分开说明,我解析的包为204字节的,188的包解析过程是一样的。

首先我们要定义头文件,头文件的作用为定义一些结构体和函数的申明。

这里给出头文件的源码(我命名为ts_head,h):

#include "define.h"
#ifndef TS_HEAD_H
#define TS_HEAD_H
//.....................结构体的定义..................

typedef struct  //定义包头结构体
{
 unsigned int continuity_counter : 4;//连续计数器
 unsigned int adaptation_field_control : 2;//附加域控制
 unsigned int transport_scambling_control : 2;//加密标志
    unsigned int PID : 13; //packet ID号
 unsigned int transport_priority : 1;//优先级标志
    unsigned int payload_uint_start_indicator : 1;//开始标志
 unsigned int transport_error_indicator : 1; //错误指示信息
 unsigned int sync_byte : 8;//8bit的同步字节

}Pack_hd_st;
typedef struct
{
 Pack_hd_st pack_head;//包头的数据
 unsigned char *buff;//指向包头后面的200字节数据
 int counter;//用来判定文件是否读到尾
}Package;
//........................函数声明....................
Pack_hd_st func_pk_content(unsigned char *buffer);
void close();
int open_file();
Pack_num pack_counter();
Package read_ts();
void output_pack_num();
#endif

对应的ts_head.cpp文件源码:  

#include "ts_head.h"
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
//#include <malloc.h>
#include <string.h>

FILE *fp=NULL;//定义一个文件流类型的全局变量
//.................................//打开文件函数........................................
int open_file()
{
 if((fp = fopen("E:\\Normal.ts","rb")) == NULL) //如果打开文件失败,打印错误信息
 {
  printf("\n error on open the file!");
  return 0;//失败返回0
 }
 else{
  return 1;//成功返回1
 }
}
//..................................关闭文件....................................................
void close()
{
 fclose(fp);
}
//.......................... //读包头的内容函数..................................................
Pack_hd_st func_pk_content(unsigned char *buff)
{ uint temp = 0;
 Pack_hd_st pack_head;
for(int i=0; i<=3; i++)
 {
  temp=temp<<8;
  temp|=(unsigned char )(*(buff+i));
 }
 memcpy(&pack_head, &temp, 4);                      

 pack_head = *(Pack_hd_st *)&temp;
 return pack_head;
}
//.........................读包函数...................................
//功能:先读取整个包的数据,提取出包头,然后开辟一段内存存储后面的数据
Package read_ts()
{
 uchar ch =  0;
 unsigned char buff[packagelength]; //开辟一段内存,大小为204,及包的大小
 uchar *ptr1 = NULL;
 uchar *ptr2 = buff;
 Package package={{0},(unsigned char*)0,0};
 while((ch = fgetc(fp)) != 0x47); //找到第一个包
 fseek(fp,-1,1);   //指针退回
 package.counter = fread(buff,packagelength,1,fp);
 package.pack_head = func_pk_content(buff);

 ptr1 = (uchar*)malloc(packagelength-4);
 ptr2 = ptr2 + 4;
 memcpy(ptr1,ptr2,packagelength-4);
 package.buff=ptr1; 
 //getchar();
 return package;
}

这个部分的功能是读所有的表都需要用到的,因为解析表必须先要将包解析出来,特别是包头中的一些数据要提取出来,如:PID等。这一部分没有什么难度。


0 0