给定一段yuv444原始序列,序列有603帧,由于实验需要,现在需要对其进行取整,只要前600帧。
代码如下:
#include<stdio.h>
char data[1920*1080*3];
int main()
{
int iWidth =1920; //视频帧的宽度
int iHeight =1080; //视频帧的高度
int totalPix =iWidth*iHeight*3;//每帧像素个数为1920×1080,且444视频序列yuv每个像素占用3byte的像素空间。
int nFrame,size,nGroup;
FILE * in,*out; //FILE是一个结构体.用来存储文件的相关信息
//FILE *用来定义文件指针
//获取输入序列
in = fopen("D:\\jiangequchen\\MissionControlClip3_1920x1080_60p_8b444_603.yuv","rb+"); //rb+表示读写一个二进制的文件
out = fopen("D:\\jiangequchen\\MissionControlClip3_1920x1080_60p_8b444_600_1.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); //重置文件指针指向文件头部
nFrame=size/totalPix; //得到视频文件的总帧数
//循环取出前600帧
int i=0;
for(int i=1;i<=600;i+=1) //从第一帧开始,逐帧抽取,直到
{
fread(data,sizeof( char),sizeof(data),in); //以至少data个字节的大小指定指向内存块的指针以存储对象, 指定每个对象的大小为sizeof(char)(以字节为单位),指定元素的数量sizeof(data),in输入
// fseek(in,0,SEEK_CUR); //in文件指针;0偏移量 ,正数表示正向偏移,负数表示负向偏移;从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET,SEEK_CUR:当前位置,SEEK_SET: 文件开头,SEEK_END: 文件结尾
fwrite(data,sizeof( char),sizeof(data),out); //data写入数据后存放地址;sizeof(char)块长度;sizeof(data)块的数量;out文件指针
}
fclose(in);
fclose(out);
return 0;
}
注意:这里要把for循环中的fseek注释掉,因为不注释掉会使指针乱飘,我在实验的过程中发现,从第347帧开始,获取的视频帧会乱飘。请教师兄说,由于fseek会导致指针乱飘,具体原因不详,欢迎感兴趣的读者一起研究讨论。