x265编码器,将YUV转换为x265_picture

x265 encoder, convert yuv to x265_picture

本文关键字:x265 picture 转换 YUV 编码器      更新时间:2023-10-16

我正在用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);

通过将 x265 将色彩空间类型设置为 i420(别名 yuv 4:2:0 平面),您可以检查此打印它:

x265_picture_init(param, pic_in);       
fprintf(stderr,"colorSpace:%sn", 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格式。