ffmpeg.exe -i src.avi -c:v rawvideo -pix_fmt yuv420p 1280x720.yuv
输出视频可以用yuvPlayer打开
建议图像命名为宽乘高 width*height,乘号用字母”x”。
使用ffmpeg的命令为:
ffmpeg.exe -i 1024x680.jpg -pix_fmt gray8 1024x680_gray8.yuv
ffmpeg.exe -i 1024x680.jpg -pix_fmt yuv420p 1024x680_420p.yuv
转换后的图像可以用软件pYUV查看,格式注意和转换的要一致,比如gray8的color space为黑白BW,subsampling选4:0:0; 而420p的颜色空间选yuv, subsampling选4:2:0
首先定义一个yuv图像的结构体
typedef struct yuvImage
{
int width; /* Image width */
int height; /* Image height */
unsigned char *y; /* y: data pointer */
unsigned char *u; /* u: data pointer */
unsigned char *v; /* v: data pointer */
} YUV_IMAGE;
// read image
FILE*fp = NULL;
fp = fopen("E:/mycode/Datasets/1024x680_gray8.yuv", "rb");
yuv的格式为: y的大小为size, u,v各为size/4;
设置yuv的起始位置
y:0
u:size
v: size+size/4
YUV_IMAGE* yuvImage= (YUV_IMAGE*)malloc(sizeof(YUV_IMAGE));
yuvImage->height= 240;
yuvImage->width= 320;
yuvImage->y= (unsigned char*)malloc((size * 3 / 2)*sizeof(unsigned char));
memset(yuvImage->y, 0, size * sizeof(unsigned char));
yuvImage->u= yuvImage->y+ size;
yuvImage->v = yuvImage->u+ size / 4;
读取
buffer = (char *)malloc(size*sizeof(char));
fread(buffer, size, 1, fp);
memcpy(yuvImage->y, buffer, size);
fread(buffer, size/4, 1, fp);
memcpy(yuvImage->u, buffer, size);
fread(buffer, size/4, 1, fp);
memcpy(yuvImage->v, buffer, size);```
另一种格式
// 420p
unsigned char*y = (unsigned char*)malloc(sizeof(unsigned char) * size);
memset(y, 0, size);
unsigned char*u = (unsigned char*)malloc(sizeof(unsigned char) * size/4);
memset(u, 0, size/4);
unsigned char*v = (unsigned char*)malloc(sizeof(unsigned char) * 1size/4);
memset(v, 0, size/4);
FILE*fp = NULL;
fp = fopen("E:/mycode/Datasets/1024x680.yuv", "rb");
fread(y, 1, size, fp);
fread(u, 1, size/4, fp);
fread(v, 1, size/4, fp);
fclose(fp);