int es_to_iframe(char esfile[], char ifile[] )
{
printf("开始提取I帧~/n");
FILE *fs;
FILE *fd;
unsigned char *temp_p;
unsigned char *p;
unsigned char pic_code_type;
unsigned char temp_buf[188*1024]={0};
unsigned char n_buf[188*1024]={0};
int i=0;
int size=0;
int file_length=0;
int queue_in=0;
int flag_iframe=0;
int ret;
fs =fopen(esfile,"rb");
fd=fopen(ifile,"wb");
if(fs==NULL||fd==NULL)
{
printf("打开文件或创建文件失败/n");
return -1;
}
fseek(fs,0,0);
int f_cur=ftell(fs);
fseek(fs,0,2);
int f_end=ftell(fs);
fseek(fs,0,0);
file_length=f_end-f_cur;//求文件长度
printf("文件长度为 %d /n",file_length);
//13714824694
while(!feof(fs))
{
if(file_length>=sizeof(temp_buf)-size)
{
printf("size= %d/n",size);
ret=fread(temp_buf+size,1,sizeof(temp_buf)-size,fs);
file_length-=(sizeof(temp_buf)-size);
printf("剩余长度为%d/n",file_length);
printf("已提取 %d 个数/n",ret);
}
else if(file_length>0)
{
if(!feof(fs))
ret=fread(temp_buf+size,1,file_length,fs);
}
else
{
printf("I帧提取完毕~/n");
fclose(fs);
fclose(fd);
return 1;
}
p=temp_buf;
while(p<temp_buf+ret+size-6)
{
if(p[0]==0x0 && p[1]==0x0 && p[2]==0x1)
{
if(p[3]==0x0 || p[3]==0xB3)
{
if((temp_p!=NULL) &&((flag_iframe==1)||(queue_in==1)))
{
memcpy(n_buf,temp_p,(p-temp_p));
fwrite(n_buf,1,(p-temp_p),fd);
flag_iframe=0;
queue_in=0;
temp_p=NULL;
memset(n_buf,'/0',sizeof(n_buf));
printf("已写入 %d 个/n",p-temp_p);
}
}
if(p[3]==0xB3)//将头写进去
{
queue_in=1;
temp_p=p;
}
pic_code_type=(p[5]>>3)&0x7;
if(p[3]==0x0 && 0x1==pic_code_type)
{
flag_iframe=1;
temp_p=p;
}
}
p++;
}
if(temp_p!=NULL)
{
size+=(temp_buf+ret-temp_p);
memmove(temp_buf,temp_p,size);
}
else
{
size+=(temp_buf+ret-p);
memmove(temp_buf,p,size);
}
temp_p=NULL;
}
fclose(fs);
fclose(fd);
printf("I帧提取完毕!/n");
return 0;
}