提取I帧

来源:互联网 发布:华钦软件拖欠工资 编辑:程序博客网 时间:2024/06/05 03:50

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;
}

原创粉丝点击