解析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等。这一部分没有什么难度。
- TS流解析之TS包头解析
- TS流解析之TS包头解析
- 解析TS流之解析TS包头数据
- TS流解析之TS包头解析(转)
- ts包头解析
- TS包头解析
- 数字电视之TS流解析
- TS流解析之PAT表格解析
- TS流解析之PMT表格解析
- TS流解析之PMT表格解析
- TS流解析之PAT表格解析
- TS流解析之PMT表格解析
- TS流解析之PAT表格解析
- TS流解析之PMT表格解析
- TS流的解析
- TS流的解析
- ts流PAT解析
- ts流PMT解析
- 输出数组所有全排列
- cv::Mat的介绍
- 文本导出到pdf文件
- Exception sending context initialized event to listener instance of class
- 原来这是一个经典面试题-------Day61
- 解析TS流之解析TS包头数据
- 平台时代,国内硬件创业博弈
- C语言参数的入栈的顺序
- 手工搭建SSH框架
- 正则表达式(Regex)--(2)
- Interfacing an SPI ADC (MCP3008) chip to the Raspberry Pi using C++ (spidev)
- 算法导论 概率 投球问题 5.4-2
- MMC/SD卡驱动实例开发讲解(一)
- 简单之内存管理