1.使用ffmpeg命令行进行转换
UYVY422格式转换RGBA8888
ffmpeg -s 1280x960 -pix_fmt uyvy422 -i test.yuv -pix_fmt rgba test.rgb
查看源文件和转换后的文件
ffplay -pixel_format uyvy422 -video_size 1280x960 test.yuv
ffplay -pixel_format rgba -video_size 1280x960 test.rgb
2.C++方法进行格式转换
void uyvyToRGBA8888(unsigned char* uyvyData, unsigned char* rgbaData, int width, int height) {
int rgba_index = 0;
for (int i = 0; i < width * height * 2; i += 4) {
unsigned char u = uyvyData[i + 0];
unsigned char y1 = uyvyData[i + 1];
unsigned char v = uyvyData[i + 2];
unsigned char y2 = uyvyData[i + 3];
int c = y1 - 16;
int d = u - 128;
int e = v - 128;
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c + 409 * e + 128) >> 8)); // R
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c - 100 * d - 208 * e + 128) >> 8)); // G
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c + 516 * d + 128) >> 8)); // B
rgbaData[rgba_index++] = 255; // A
c = y2 - 16;
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c + 409 * e + 128) >> 8)); // R
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c - 100 * d - 208 * e + 128) >> 8)); // G
rgbaData[rgba_index++] = std::max(0, std::min(255, (298 * c + 516 * d + 128) >> 8)); // B
rgbaData[rgba_index++] = 255; // A
}
}