#include "Conversion.h"
FILE * OpenInputFile(FILE * FinputFile,char * InputFileName)
{
FILE * inFile = NULL;
FinputFile = fopen(InputFileName,"rb");
if (NULL == FinputFile)
{
printf("打开输入文件TS失败!\n");
return NULL;
}
inFile = FinputFile;
fseek(FinputFile,0L,SEEK_END);
inputfile_length = ftell(FinputFile);
printf("本测试文件的长度是 %ld 个字节\n",inputfile_length);
fseek(FinputFile,0L,SEEK_SET); // 文件指针移动到文件首
return FinputFile;
}
FILE * OpenOutputFile(FILE * FOutputFile,char * OutputFileName)
{
FOutputFile = fopen(OutputFileName, "w");
if (NULL != FOutputFile)
{
fclose(FOutputFile);
fopen(OutputFileName, "w");//文件清空
fclose(FOutputFile);
FOutputFile = NULL;
}
else
{
printf("打开输出文件失败!\n");
}
FOutputFile = fopen(OutputFileName, "wb");
return FOutputFile;
}
FILE * OpenOutputNEWh264File(FILE * FOutputFile,char * OutputFileName)
{
FOutputFile = fopen(OutputFileName, "w");
if (NULL != FOutputFile)
{
fclose(FOutputFile);
fopen(OutputFileName, "w");//文件清空
fclose(FOutputFile);
FOutputFile = NULL;
}
else
{
printf("打开输出文件失败!\n");
}
FOutputFile = fopen(OutputFileName, "wb");
return FOutputFile;
}
int CloseInputFile(FILE * FInputFile)
{
fclose(FInputFile);
return 1;
}
int CloesOutputFile(FILE * FOutputFile)
{
fclose(FOutputFile);
return 1;
}
TsPacketHeader * CreateTsHeader(TsPacketHeader * ts_header,unsigned int PID,unsigned char play_init,unsigned char ada_field_C,unsigned char conti_cter)
{
ts_header->sync_byte = TS_SYNC_BYTE;
ts_header->tras_error = 0x00;
ts_header->play_init = play_init;
ts_header->tras_prio = 0x01;
ts_header->PID = PID;
ts_header->tras_scramb = 0x00;
ts_header->ada_field_C = ada_field_C;
ts_header->conti_cter = conti_cter;
return ts_header;
}
int TsHeader2buffer( TsPacketHeader * ts_header,unsigned char *buffer)
{
buffer[0]=ts_header->sync_byte;
buffer[1]=ts_header->tras_error<<7|ts_header->play_init<<6|ts_header->tras_prio<<5|((ts_header->PID>>8)&0x1f);
buffer[2]=(ts_header->PID&0x00ff);
buffer[3]=ts_header->tras_scramb<<6|ts_header->ada_field_C<<4|ts_header->conti_cter;
return 1;
}
int CRC_crc32Calculate(unsigned char *buffer, unsigned int size, unsigned int *CRC32)
{
unsigned int crc32 = 0xFFFFFFFF;
unsigned int cntByte,temp1,temp2,temp3;
for (cntByte = 0; cntByte < size; cntByte++)
{
temp1 = (crc32 << 8 );
temp2 = crc32_table[((crc32 >> 24) ^ * buffer) & 0xFF];
temp3 = temp1^temp2;
crc32 = (crc32 << 8 ) ^ crc32_table[((crc32 >> 24) ^ * buffer++) & 0xFF];
}
*CRC32 = crc32;
return 1;
}
int CreatePAT()
{
TsPacketHeader * ts_header;
TsPat * ts_pat;
unsigned char PatBuf[TS_PACKET_SIZE];
unsigned char * pointer_pat;
unsigned int PAT_CRC = 0xFFFFFFFF;
ts_header = (TsPacketHeader *)malloc(sizeof(TsPacketHeader) * 1);
ts_pat = (TsPat * )malloc(sizeof(TsPat) * 1);
memset(PatBuf,0xFF,TS_PACKET_SIZE); //将一个包填成0xFF
pointer_pat = PatBuf;
ts_header = CreateTsHeader(ts_header,TS_PAT_PID,0x01,0x01,0x00); //PID = 0x00,有效荷载单元起始指示符_play_init = 0x01, ada_field_C,0x01,仅有有效负载,conti_cter 计数为 0 ;
TsHeader2buffer(ts_header,PatBuf);
pointer_pat[4] = 0; //自适应段的长度为0
pointer_pat += 5;
ts_pat->table_id = 0x00;
ts_pat->section_syntax_indicator = 0x01;
ts_pat->zero = 0x00;
ts_pat->reserved_1 = 0x03; //设置为11;
ts_pat->section_length = 0x0d; //pat结构体长度 16个字节减去上面的3个字节
ts_pat->transport_stream_id = 0x00;
ts_pat->reserved_2 = 0x03; //设置为11;
ts_pat->version_number = 0x00;
ts_pat->current_next_indicator = 0x01; //当前的pat 有效
ts_pat->section_number = 0x00;
ts_pat->last_section_number = 0x00;
ts_pat->program_number = 0x01;
ts_pat->reserved_3 = 0x07; //设置为111;
ts_pat->program_map_PID = TS_PMT_PID; //PMT的PID
ts_pat->CRC_32 = PAT_CRC; //传输过程中检测的一种算法值 先设定一个填充值
pointer_pat[0] = ts_pat->table_id;
pointer_pat[1] = ts_pat->section_syntax_indicator << 7 | ts_pat->zero << 6 | ts_pat->reserved_1 << 4 | ((ts_pat->section_length >> 8) & 0x0F);
pointer_pat[2] = ts_pat->section_length & 0x00FF;
pointer_pat[3] = ts_pat->transport_stream_id >> 8;
pointer_pat[4] = ts_pat->transport_stream_id & 0x00FF;
pointer_pat[5] = ts_pat->reserved_2 << 6 | ts_pat->version_number << 1 | ts_pat->current_next_indicator;
pointer_pat[6] = ts_pat->section_number;
pointer_pat[7] = ts_pat->last_section_number;
pointer_pat[8] = ts_pat->program_number>>8;
pointer_pat[9] = ts_pat->program_number & 0x00FF;
pointer_pat[10]= ts_pat->reserved_3 << 5 | ((ts_pat->program_map_PID >> 8) & 0x0F);
pointer_pat[11]= ts_pat->program_map_PID & 0x00FF;
CRC_crc32Calculate(PatBuf,ts_pat->section_length + 3 ,&PAT_CRC);
pointer_pat[12]= PAT_CRC >> 24;
pointer_pat[13]= PAT_CRC >> 16;
pointer_pat[14]= PAT_CRC >> 8;
pointer_pat[15]= PAT_CRC & 0x000000FF;
fwrite(PatBuf,188,1,FOutVideoTs); //将PAT包写入文件
return 1;
}
int CreatePMT()
{
TsPacketHeader * ts_header;
TsPmt * ts_pmt;
unsigned char PmtBuf[TS_PACKET_SIZE];
unsigned char * pointer_pmt;
unsigned int PMT_CRC = 0xFFFFFFFF;
ts_header = (TsPacketHeader *)malloc(sizeof(TsPacketHeader) * 1);
ts_pmt = (TsPmt * )malloc(sizeof(TsPmt) * 1);
memset(PmtBuf,0xFF,TS_PACKET_SIZE); //将一个包填成0xFF
pointer_pmt = PmtBuf;
ts_header = CreateTsHeader(ts_header,TS_PMT_PID,0x01,0x01,0x00); //PID = 0x00,有效荷载单元起始指示符_play_init = 0x01, ada_field_C,0x01,仅有有效负载,conti_cter 计数为 0 ;
TsHeader2buffer(ts_header,PmtBuf);
pointer_pmt[4] = 0; //自适应段的长度为0
pointer_pmt += 5;
ts_pmt->table_id = 0x02;
ts_pmt->section_syntax_indicator = 0x01;
ts_pmt->zero = 0x00;
ts_pmt->reserved_1 = 0x03;
ts_pmt->section_length = 0x17; //PMT结构体长度 16 + 5 + 5个字节减去上面的3个字节
ts_pmt->program_number = 01; //只有一个节目
ts_pmt->reserved_2 = 0x03;
ts_pmt->version_number = 0x00;
ts_pmt->current_next_indicator = 0x01; //当前的PMT有效
ts_pmt->section_number = 0x00;
ts_pmt->last_section_number = 0x00;
ts_pmt->reserved_3 = 0x07;
ts_pmt->PCR_PID = TS_H264_PID ; //视频PID
ts_pmt->reserved_4 = 0x0F;
ts_pmt->program_info_length = 0x00; //后面无 节目信息描述
ts_pmt->stream_type_video = 0x1B; //视频的类型
ts_pmt->reserved_5_video = 0x07;
ts_pmt->elementary_PID_video = TS_H264_PID; //视频的PID
ts_pmt->reserved_6_video= 0x0F;
ts_pmt->ES_info_length_video = 0x00; //视频无跟随的相关信息
ts_pmt->stream_type_audio = 0x03; //音频类型
ts_pmt->reserved_5_audio = 0x07;
ts_pmt->elementary_PID_audio = TS_MP3_PID; //音频PID 暂不处理
ts_pmt->reserved_6_audio = 0x0F;
ts_pmt->ES_info_length_audio = 0x00; //音频无跟随的相关信息
ts_pmt->CRC_32 = PMT_CRC;
pointer_pmt[0] = ts_pmt->table_id;
pointer_pmt[1] = ts_pmt->section_syntax_indicator << 7 | ts_pmt->zero << 6 | ts_pmt->reserve
没有合适的资源?快使用搜索试试~ 我知道了~
TS_打包_本地文件_H264_1
共28个文件
264:4个
h:3个
pdb:2个
5星 · 超过95%的资源 需积分: 9 76 下载量 146 浏览量
2012-09-28
12:59:06
上传
评论 4
收藏 7.43MB 7Z 举报
温馨提示
H264 本地文件 打成 TS 包,用纯c 写的,里面有些参数 还没透彻的研究,不过本demo 还是成功的达到了目的
资源推荐
资源详情
资源评论
收起资源包目录
TS_打包_本地文件_H264_1.7z (28个子文件)
TS_打包_本地文件_H264_1
TS_ PACK
TS_ PACK.ncb 835KB
H264
NEW66.264 4.06MB
66.264 4.06MB
44.264 2.94MB
NEW44.264 2.94MB
TS
66.ts 4.41MB
44.ts 3.09MB
TS_ PACK.sln 890B
TS_ PACK
TS_ PACK.vcproj 4KB
Conversion.h 3KB
main.c 1KB
Information.h 8KB
CRC.h 3KB
Conversion.c 28KB
TS_ PACK.vcproj.HOLD.zhuwg.user 1KB
Debug
BuildLog.htm 17KB
TS_ PACK.exe.intermediate.manifest 621B
Conversion.obj 39KB
vc90.pdb 68KB
main.obj 8KB
vc90.idb 43KB
TS_ PACK.exe.embed.manifest.res 728B
TS_ PACK.exe.embed.manifest 663B
mt.dep 65B
Debug
TS_ PACK.pdb 411KB
TS_ PACK.exe 46KB
TS_ PACK.ilk 344KB
TS_ PACK.suo 20KB
共 28 条
- 1
朱韦刚
- 粉丝: 754
- 资源: 76
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页