【问题标题】:YUV420P to JPEG by ffmpegffmpeg 将 YUV420P 转为 JPEG
【发布时间】:2012-04-10 15:43:25
【问题描述】:

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

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

获取图片我必须做什么?

【问题讨论】:

  • 您是否尝试过运行 ffmpeg 命令来实际将您的 YUV 帧转换为 JPEG?
  • 我做不到,因为我的 YUV 数据被分隔到不同的文件中(对于每一帧,有 3 个文件,其中包含 Y 数据 U 数据和 V 数据,它们的行大小显示在它们的文件名中)
  • 嗯,我会编写代码来合并所有三个,应该不难。因为如果你不能在 cmd 中测试它,那么编码它的机会就会更低。
  • 听起来你已经接近解决这个任务了。您可以发布示例图像以说明错误吗?有时很容易看出问题(U 和 V 平面交换;线大小减 1)。

标签: c++ ffmpeg jpeg yuv


【解决方案1】:

也许您应该使用 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 是线大小。

【讨论】:

  • 这非常接近,但它使用我的测试驱动程序生成的图像是黑白的。
【解决方案2】:

您需要使用 `libswscale.我的answer 之一可以帮助您。选择合适的PIXEL FORMAT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2018-11-19
    • 2018-03-14
    • 2014-04-27
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多