如何从一个帧数有限的yuv文件获得更多帧数的文件

  1. //实现功能:把某一个1080p的yuv文件重复写入新的yuv文件  
  2. //N:表示重复写入的次数,生成一个更大的yuv文件,用来测试  
  3. //得注意一个问题:feof()  
  4.   
  5. #include <stdio.h>  
  6. #include <memory.h>  
  7. #include <stdlib.h>  
  8.   
  9. #define  VIDEO_SOURCE_FILE "D:\\cudaEncode\\data\\ED_1920_1080.yuv"//214帧  
  10. #define  VIDEO_OUTPUT_FILE "D:\\cudaEncode\\data\\ED_1920_1080_2.yuv"  
  11. #define  SIZE  1920*1080*3/2  
  12. #define  N 2  
  13.   
  14. int main()  
  15. {  
  16.     FILE *fpIn,*fpOut;  
  17.     int count=1;  
  18.     if ((fpIn=fopen(VIDEO_SOURCE_FILE,"rb"))==NULL)  
  19.     {  
  20.         printf("fopen() error!\n");  
  21.     }  
  22.     if((fpOut=fopen(VIDEO_OUTPUT_FILE,"wb"))==NULL)  
  23.     {  
  24.         printf("fopen() error!\n");  
  25.     }  
  26.     char *buf;  
  27.     buf=(char *)malloc(SIZE);  
  28.     memset(buf,0,SIZE);  
  29.       
  30.     for (int i=0;i<N;i++)  
  31.     {  
  32.         fread(buf,1,SIZE,fpIn);  
  33.         while (!feof(fpIn))  
  34.         {  
  35.             printf("第 %d 次写入第 %3d 帧\n",i,count);  
  36.             fwrite(buf,1,SIZE,fpOut);  
  37.             fread(buf,1,SIZE,fpIn);  
  38.             count++;  
  39.         }  
  40.         /* 
  41.         while (!feof(fpIn)) 
  42.         { 
  43.             fread(buf,1,SIZE,fpIn); 
  44.             printf("第 %d 次写入第 %3d 帧\n",i,count); 
  45.             fwrite(buf,1,SIZE,fpOut); 
  46.             count++; 
  47.         } 
  48.         //这种写法会把最后一帧重复写一遍 
  49.         //为什么呢?因为feof判断最后一帧的时候,并不能确定是最后一帧, 
  50.         //只有再接着fread才能确定,此时才返回1值 
  51.         */  
  52.         rewind(fpIn);//或fseek(fpIn,0L,SEEK_SET);  
  53.         count=1;  
  54.     }  
  55.     printf("完成!\n");  
  56.     free(buf);  
  57.     buf=NULL;  
  58.     fclose(fpIn);  
  59.     fclose(fpOut);  
  60.     return 0;  
  61. }  

上面针对的是1080p的yuv文件,4:2:0,分辨率为1920x1080.

如果是其他格式的yuv分辨率,只需把SIZE修改下,4:2:0下,一帧的大小:分辨率乘积*3/2

为什么是先乘以3再除以2呢,这与采样格式有关。

对于4:4:4没有压缩的格式,8比特量化后,每个像素占用3个字节,那么4:4:4采样格式的文件每一帧大小为:分辨率乘积*3

对于4:2:2采样格式,每4个像素,需要字节数为4+2+2=8,则每个像素占用8/4=2个字节,则每一帧大小为:分辨率乘积*2

对于4:1:1采样格式,每4个像素,需要字节数为4+1+1=6,则每个像素占用6/4=1.5个字节,则每一帧大小为:分辨率乘积*3/2

对于4:2:0采样格式(最常用),同时对水平方向和垂直方向采样

两行8个像素,需要字节数为:第一行4+2,第二行4+2,总共需要字节数为12,则每个像素占用12/8=1.5个字节,则每一帧大小为:分辨率乘积*3/2

你可能感兴趣的:(计算机视觉)