背景
最近在学习音视频编解码相关知识,其中涉及到了YUV相关知识.
想要将一个YUV420P格式图片的三个分量分别保存出来并且显示.
参考
YUV格式的讲解:
https://www.bilibili.com/video/BV1pT4y1R7SN?p=4
https://blog.csdn.net/weixin_41157654/article/details/103994570
https://blog.csdn.net/leixiaohua1020/article/details/50466201
生成YUV图片
.\ffmpeg.exe -i input.jpg -s 640x480 -pix_fmt yuv420p output.yuv
注意这里使用了的图片尺寸要和实际图片尺寸一致,
建议先使用640*480尺寸图片跑通整个流程
分别生成Y/U/V分量图片
//描述: 测试YUV分离
void split_yuv420p(char* inputPath, int width, int height) {
FILE* fp_yuv = fopen(inputPath, "rb+");
FILE* fp_y = fopen("dog_640x480.y", "wb+");
FILE* fp_u = fopen("dog_640x480.u", "wb+");
FILE* fp_v = fopen("dog_640x480.v", "wb+");
//因为一个y(8)+u/4(2) + v/4(2) = 12bit = 1.5个字节
unsigned char* data = (unsigned char*)malloc(width * height * 3 / 2);
//整张图片读进来
fread(data, 1, width * height * 3 / 2, fp_yuv);
//Y
fwrite(data, 1, width * height, fp_y);
//U
fwrite(data + width * height, 1, width * height / 4, fp_u);
//V
fwrite(data + width * height * 5 / 4, 1, width * height / 4, fp_v);
//释放资源
free(data);
fclose(fp_yuv);
fclose(fp_y);
fclose(fp_u);
fclose(fp_v);
}
验证Y/U/V图片数据
下载雷神提供的显示软件
https://blog.csdn.net/leixiaohua1020/article/details/50466201
重点:
x 显示图片的时候,要选择像素格式中的Y分量,即使是查看U/V图片的时候也是如此
x 查看Y分量图片的时候,使用的分辨率是640x480
x 查看U/V分量图片的时候,使用的分辨率是320x240