C++ 通过ffmpeg将YUV420P转换为JPEG

C++ 通过ffmpeg将YUV420P转换为JPEG,c++,ffmpeg,jpeg,yuv,C++,Ffmpeg,Jpeg,Yuv,我的任务: 通过ffmpeg将YUV帧数据转换为jpeg图像。 我所拥有的: 每个平面的数据和每个平面的线条尺寸 我试图创建空的AVFrame,并用这些信息填充它的数据和行大小,但在使用CODEC_ID_MJPEG CODEC将其编码为图像并保存到文件后,还没有得到正确的JPEG 要获取图像,我必须做什么?您需要使用“libswscale”缩放图像以获得正确的JPEG文件。我的一个朋友可以帮你。选择合适的像素格式也许您应该使用jpeglib来实现这一点。这是我的密码 FILE *outfile

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

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


要获取图像,我必须做什么?

您需要使用“libswscale”缩放图像以获得正确的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);
FILE*outfile=fopen(路径“wb+”);
如果(!outfile)
返回1;
h&=~15;
结构jpeg\u压缩\u结构cinfo;
结构jpeg\u错误\u管理器jerr;
cinfo.err=jpeg\u std\u error(&jerr);
jpeg\u创建\u压缩(&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\u set\u默认值(&cinfo);
jpeg设置质量(&cinfo,90,真);
cinfo.dct_方法=JDCT_;
cinfo.raw_data_in=TRUE;
cinfo.comp_info[0].样本系数=2;
cinfo.comp_info[0].v_samp_factor=2;
cinfo.comp_info[1].样本系数=1;
cinfo.comp_info[1].v_samp_factor=1;
cinfo.comp_info[2].样本系数=1;
cinfo.comp_info[2].v_samp_factor=1;
int i,j;
jsamproy[16],cb[16],cr[16];
jsampp[3];
jpeg\u start\u compress(&cinfo,TRUE);
p[0]=y;
p[2]=cb;
p[1]=cr;
对于(j=0;j

其中,
data
是YUV平面数据,
line
是线条大小。

您是否尝试过运行ffmpeg命令将YUV帧转换为JPEG?我做不到,因为我的YUV数据被分为不同的文件(每一帧有3个文件,其中包含Y-data U-data和V-data,它们的线条大小显示在文件名中)Hm,我会编写代码来合并这三者,这应该不难。因为如果你不能在cmd中测试它,那么编码它的几率就会降低。听起来你已经接近解决这个任务了。你能发布一张示例图片来说明错误吗?有时很容易看到问题(U&V平面交换;线宽减小1)。这非常接近,但它使用我的测试驱动程序生成的图像是黑白的。