YUV420P в JPEG с помощью ffmpeg

Моя задача: преобразовать данные кадра YUV в изображения jpeg с помощью ffmpeg. Что у меня есть: Данные каждой плоскости и размер линии для каждой;

Я попытался создать пустой AVFrame и заполнить его данными и размером строки этой информацией, но после кодирования его с помощью кодека CODEC_ID_MJPEG для изображений и сохранения в файлы не получил правильный jpeg.

Что я должен сделать для получения изображений?


person mmmaaak    schedule 10.04.2012    source источник
comment
Вы пытались запустить команду ffmpeg, которая фактически преобразует ваши кадры YUV в JPEG?   -  person Patrick.SE    schedule 10.04.2012
comment
Я не могу этого сделать, потому что мои данные YUV разделены на разные файлы (для каждого кадра есть 3 файла с Y-данными, U-данными и V-данными, размер строки которых отображается в их именах файлов)   -  person mmmaaak    schedule 10.04.2012
comment
Хм, я бы написал код для объединения всех трех, это не должно быть сложно. Потому что, если вы не можете проверить это в cmd, шансы на кодирование ниже.   -  person Patrick.SE    schedule 10.04.2012
comment
Похоже, вы близки к решению этой задачи. Можете ли вы опубликовать образец изображения, чтобы проиллюстрировать ошибку? Иногда легко увидеть проблему (плоскости U и V поменялись местами; размер линии уменьшился на 1).   -  person Multimedia Mike    schedule 11.04.2012


Ответы (2)


Возможно, вам следует использовать 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 — линейный размер.

person XieRan    schedule 12.01.2013
comment
Это очень близко, но изображение, которое он создает с моим тестовым драйвером, черно-белое. - person spartygw; 07.08.2015

вам нужно масштабировать изображение, чтобы получить правильные файлы JPEG, используя `libswscale. один из моих ответ может помочь вам в этом. выберите правильный ФОРМАТ ПИКСЕЛЕЙ.

person N.Droid    schedule 10.04.2012