问题描述:
给定一段yuv444序列,序列有600帧,由于实验需要进行抽帧,要求每20帧为一组,每组抽取第18,19帧两帧,一共是30组60帧。(17,18,37,38,57,58…以此类推)实验程序如下。
奇怪的是,
34帧及以前是没问题的
开始出问题帧(35帧及以后):
很明显能看到把一帧原始的图片错位分割了
正常的帧应该是左边这张:
本人能力有限,困扰了许久不得,个人猜测是程序跳过17帧,每组跳过18帧,这样的数字组合恰好是35(盲猜)。请教师兄,他们觉得是说指针出现了问题乱飘,但是不知道怎么解决。还望各位大佬指点指点~
有兴趣可以尝试一下
代码如下:
#include<stdio.h>
unsigned char data[1920*1080*3];
int main()
{
int iWidth =1920; //宽
int iHeight =1080; //高
int totalPix =iWidth*iHeight*3;
int nFrame,size,nGroup;
FILE * in,*out; //FILE是一个结构体.用来存储文件的相关信息
//FILE *用来定义文件指针
//获取输入序列
in = fopen("D:\\jiangequchen\\MissionControlClip3_1920x1080_60p_8b444_600.yuv","rb+"); //rb+表示读写一个二进制的文件
out = fopen("D:\\jiangequchen\\MissionControlClip3_1920x1080_60p_8b444_600_2x30.yuv","a"); //a表示以附加的方式打开只写文件,若指定位置没有该文件,则创建该文件,
//若存在该文件,则将要添加的内容放在在文件的末尾
if(in==NULL)
{
return -1;
}
fseek(in,0,SEEK_END); //将文件指针移到文件末尾,偏移0个字节;fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);解释:其作用是将位置指针移到离文件头50个字节处
size=ftell(in); //得到文件尾相对于文件首的位移,即文件的总字节数
//fseek(in,0,SEEK_END);
rewind(in); //重置文件指针指向文件头部
fseek(in,totalPix*17,SEEK_SET);//跳过17帧,将指针移动第18帧开头的位置
nFrame=size/totalPix; //得到视频文件的总帧数
//循环取帧
for(int k=0;k<30;k++)
{
for(int i=18;i<=19;i++)
{
fread(data,sizeof(unsigned char),sizeof(data),in); //以至少data个字节的大小指定指向内存块的指针以存储对象, 指定每个对象的大小为sizeof(char)(以字节为单位),指定元素的数量sizeof(data),in输入
//fseek(in,0,SEEK_CUR); //in文件指针
fwrite(data,sizeof(unsigned char),sizeof(data),out); //data写入数据后存放地址;sizeof(char)块长度;sizeof(data)块的数量;out文件指针
}
fseek(in,totalPix*18,SEEK_CUR);
}
fclose(in);
fclose(out);
return 0;
}