gpt4 book ai didi

c++ - ffmpeg 将 YUV420P 转为 JPEG

转载 作者:行者123 更新时间:2023-12-04 23:31:40 26 4
gpt4 key购买 nike

我的任务:
通过 ffmpeg 将 YUV Frame 数据转换为 jpeg 图像。
我有的:
每个平面的数据和每个平面的线尺寸;

我试图创建空的 AVFrame 并用这些信息填充它的数据和行大小,但是在使用 CODEC_ID_MJPEG 编解码器将其编码为图像并将其保存到文件之后,没有得到正确的 jpeg。

获取图像我必须做什么?

最佳答案

也许你应该使用 jpeglib 来做到这一点。这是我的代码

FILE *outfile = fopen(path, "wb+");

if (!outfile)
return 1;
h &= ~15;

struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);

cinfo.image_width = w;
cinfo.image_height = h;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_YCbCr;

jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 90, TRUE);
cinfo.dct_method = JDCT_FASTEST;

cinfo.raw_data_in = TRUE;
cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 2;
cinfo.comp_info[1].h_samp_factor = 1;
cinfo.comp_info[1].v_samp_factor = 1;
cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1;

int i, j;
JSAMPROW y[16], cb[16], cr[16];
JSAMPARRAY p[3];

jpeg_start_compress(&cinfo, TRUE);
p[0] = y;
p[2] = cb;
p[1] = cr;

for (j = 0; j < cinfo.image_height; j += 16) {
for (i = 0; i < 16; i++) {
y[i] = data[0] + line[0]*(i+j);
cr[i/2] = data[1] + line[1]*((i+j)/2);
cb[i/2] = data[2] + line[2]*((i+j)/2);
}
jpeg_write_raw_data(&cinfo, p, 16);
}

jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);

在哪里 data是 YUV 平面数据和 line是线大小。

关于c++ - ffmpeg 将 YUV420P 转为 JPEG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com