读取YUV视频文件

如何读取YUV视频文件

例如:
QCIF应该是176×144

若是4:2:0的QCIF,每帧图像应该是176×144个Y,44×36个U,以及44×36个V。


根据资料介绍,YUV有很多格式

YUY2 格式,以4:2:2 方式打包
YUYV 格式(实际格式与YUY2 相同)
YVYU 格式,以4:2:2 方式打包
UYVY 格式,以4:2:2 方式打包
带Alpha 通道的4:4:4 YUV 格式
Y41P 格式,以4:1:1 方式打包
Y411 格式(实际格式与Y41P 相同)
Y211 格式
IF09 格式
IYUV 格式
YV12 格式 (4:2:0方式打包,适用于视频会议,数字电视,DVD存储)
注:在文件中是顺序存储的(先存Y空间,然后是U空间,再是V空间)

YVU9 格式


////////////////////////////////////////////
附代码:(我的视频流就是YV12格式的)

说明:读取300帧图像,在CCS软件仿真下面可以显示。

CCS环境下面,project/Build Options/Compiler/Advanced/Memory Models选项要作设置,
选择-ml0       Aggregate data (structs/arrays) default to far


#include <stdio.h>
#define cif

#ifdef qcif
#define Y_WIDTH 176
#define Y_HEIGHT 144
#define U_WIDTH 88
#define U_HEIGHT 72
#define V_WIDTH 88
#define V_HEIGHT 72
#endif

#ifdef cif
#define Y_WIDTH 352
#define Y_HEIGHT 288
#define U_WIDTH 176
#define U_HEIGHT 144
#define V_WIDTH 176
#define V_HEIGHT 144
#endif

void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset);

unsigned char Y_space[Y_WIDTH*Y_HEIGHT];
unsigned char U_space[U_WIDTH*U_HEIGHT];
unsigned char V_space[V_WIDTH*V_HEIGHT];

main()
{int i=0;
 long origin;
 for(i=0,origin=0;i<300;i++,origin+=(Y_WIDTH*Y_HEIGHT+U_WIDTH*U_HEIGHT+V_WIDTH*V_HEIGHT))
 {
  ReadImage(Y_space,"..//bridge-close.cif",Y_WIDTH,Y_HEIGHT,origin);
  ReadImage(U_space,"..//bridge-close.cif",U_WIDTH,U_HEIGHT,Y_WIDTH*Y_HEIGHT);
  ReadImage(V_space,"..//bridge-

close.cif",V_WIDTH,V_HEIGHT,Y_WIDTH*Y_HEIGHT+U_WIDTH*U_HEIGHT);
 } 
  while ( 1 ); 
}


void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset)
{
 int j,i;
 unsigned char *pWork;
 FILE *fp=0;

 if ( fp=fopen(cFileName,"rb" ) )   //打开一幅图像
 {
  fseek(fp,offset,SEEK_SET);   //文件定位
   pWork=pImage; //指针指向
  for ( j=0;j<nHeight;j++,pWork+=nWidth )
   for ( i=0;i<nWidth;i++ )
    fread(pWork+i,1,1,fp); //顺序读取
  fclose(fp);
 }
}

 读取YUV视频文件_第1张图片

 读取YUV视频文件_第2张图片

你可能感兴趣的:(读取YUV视频文件)