代码如下:
#includechar 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会导致指针乱飘,具体原因不详,欢迎感兴趣的读者一起研究讨论。



