кодировщик x265, конвертируйте yuv в x265_picture

Я пишу приложение на C ++ и хочу преобразовать yuv изображение, которое я получаю с веб-камеры на x265_picture, так что это может быть закодировано в hevc, Я следовал за учебником на http://x265.readthedocs.org/en/default/api.html#introduction. Но нет ничего о том, как вы можете конвертировать yuv в x265_picture, Как это можно сделать?

x265_param *param = x265_param_alloc();

x265_param_default_preset(param, "ultrafast", "zerolatency");

x265_param_parse(param, "fps", "30");
x265_param_parse(param, "input-res", "352x288"); //wxh
x265_param_parse(param, "bframes", "0");
x265_param_parse(param, "rc-lookahead", "20");
x265_param_parse(param, "repeat-headers", "1");

x265_picture *pic_in = x265_picture_alloc();
x265_picture *pic_out = x265_picture_alloc();

x265_picture_init(param, pic_in);

x265_nal *pp_nal;
uint32_t pi_nal;
x265_encoder *encoder = x265_encoder_open(param);
x265_encoder_encode(encoder, &pp_nal, &pi_nal, pic_in, pic_out);

1

Решение

По умолчанию x265 устанавливает тип цветового пространства в i420 (псевдоним yuv 4: 2: 0 планарный), вы можете проверить это печать это:

x265_picture_init(param, pic_in);
fprintf(stderr,"colorSpace:%s\n", x265_source_csp_names[pic_in->colorSpace]);

Чтобы связать входную структуру x265_picture с вашей i420 буфер, вы должны использовать что-то вроде:

pic_in->stride[0] = param->sourceWidth;
pic_in->stride[1] = pic_in->stride[0] >> x265_cli_csps[pic_in->colorSpace].width[1];
pic_in->stride[2] = pic_in->stride[0] >> x265_cli_csps[pic_in->colorSpace].width[2];
pic_in->planes[0] = i420_buffer;
pic_in->planes[1] = (char*)pic_in->planes[0] + pic_in->stride[0] * param->sourceHeight;
pic_in->planes[2] = (char*)pic_in->planes[1] + pic_in->stride[1] * (param->sourceHeight >> x265_cli_csps[pic_in->colorSpace].height[1]);

Если yuv формат вашей веб-камеры другой, вы можете либо установить тип цветового пространства (если это поддерживает libx265), либо использовать libyuv преобразовать в i420 формат.

0

Другие решения


По вопросам рекламы [email protected]