如何读取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);
}
}