从H264中提取NAL

#include<stdio.h>
#define BUFSIZE 4
char buffer[BUFSIZE];


typedef struct nalu{
unsigned char *nal;
}nalu_t;




typedef void (*func)(nalu_t *nal,int length);
FILE *fp = NULL;
long pos = 0;
int readcount = 0;
int prepos = 0;
int temp = 0;




void getNalu(nalu_t *nal, int length){


//打印nal
int i;
for (i = 0; i < length;i++)
{
printf("%02X ", nal->nal[i]);
if ((i+1) % 10 == 0)
{
printf("||\n");
}
}
printf("\n\n");

/*if (temp == 3)
{
system("pause");
}
temp++;
*/
}


int num3zero()
{
if (buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0x01)
{
return 0;
}
return -1;
}
int num4zero()
{
if (buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0x00 && buffer[3] == 0x01)
{
return 0;
}
return -1;
}


int open(const char *path)
{
fp = fopen(path, "rb");
if (fp == NULL)
{
perror("file open failed\n");
return -1;
}
return 0;
}


int ParserH264(func getNalu)
{
nalu_t *nalu = (nalu_t *)malloc(sizeof(nalu_t));
if ((nalu) == NULL)
{
perror("malloc failed\n");
return -1;
}
nalu->nal = (unsigned char *)malloc(1024 * 1024 * 6);
if (nalu->nal == NULL)
{
perror("malloc failed\n");
return -1;


}


int nread;
long readnum;
int flag = 0;
long end;
while (1)
{
temp = fseek(fp, pos, SEEK_SET);
if (temp != 0)
{
printf("%d fseek faile\n",temp);
}
nread = fread(buffer,1,BUFSIZE,fp);
if (nread < BUFSIZE)
{
if (feof(fp))
{
//到达文件结尾,把尾部读取完整
end = ftell(fp);
pos = end;
flag = 1;
//printf("end of file\n");
//break;
}
if (ferror(fp))
{
printf("fread error\n");
break;
}
}


//if (nread == BUFSIZE)
//{
if (num3zero() == 0)
{
if (pos != 0 && prepos !=0 )
{
readnum = pos - prepos;
fseek(fp, prepos, SEEK_SET);
fread(nalu->nal, 1, readnum, fp);
getNalu(nalu, readnum);
}
pos += 3;
prepos = pos;
continue;
}
else if(num4zero() == 0)
{
if (pos != 0 && prepos != 0)
{
readnum = pos - prepos;
fseek(fp, prepos, SEEK_SET);
fread(nalu->nal, 1, readnum, fp);
getNalu(nalu, readnum);
}
pos += 4;
prepos = pos;
printf("%d\n",pos);
continue;
}
else
{
if (!flag)
{
pos++;
continue;
}
}
//}
//到达文件结尾 ,退出
//fseek(fp, pos, SEEK_SET);
if (flag)
{
fseek(fp, prepos, SEEK_SET);
readnum = pos - prepos;
fread(nalu->nal, 1, readnum, fp);
getNalu(nalu, readnum);
printf("end of file\n");
fclose(fp);
break;
}



}

//if (nalu != NULL)
//{
// free(nalu);
//}
return 0;
}




int main()
{
const char *path = "video.264";
int isopen;
isopen = open(path);
if (isopen!= 0 )
{
printf("open file failed\n");
system("pause");
}




ParserH264(getNalu);
system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值