如何使用x264 C API将RBG图像编码为H264帧?我已经创建了一系列RBG图像,现在如何将该序列转换为H264帧的序列?特别是,如何将这一系列RGB图像编码为H264帧序列,该序列由单个初始H264关键帧和从属H264帧组成?
如何使用x264 C API将RBG图像编码为H264帧?我已经创建了一系列RBG图像,现在如何将该序列转换为H264帧的序列?特别是,如何将这一系列RGB图像编码为H264帧序列,该序列由单个初始H264关键帧和从属H264帧组成?
首先:判断x264.h文件,它或多或少包含每个函数和 struct 的引用.x264.下载的c文件包含一个示例实现.大多数人都说要以这一点为基础,但我发现这对初学者来说相当复杂,不过这是一个很好的例子.
首先设置一些参数,类型为x264_param_t,描述参数的好站点是http://mewiki.project357.com/wiki/X264_Settings.还可以看看x264_param_default_preset
函数,它允许您在不需要了解所有(有时相当复杂)参数的情况下针对某些功能.之后也使用x264_param_apply_profile
(你可能需要"基线"配置文件)
以下是我的代码中的一些示例设置:
x264_param_t param;
x264_param_default_preset(¶m, "veryfast", "zerolatency");
param.i_threads = 1;
param.i_width = width;
param.i_height = height;
param.i_fps_num = fps;
param.i_fps_den = 1;
// Intra refres:
param.i_keyint_max = fps;
param.b_intra_refresh = 1;
//Rate control:
param.rc.i_rc_method = X264_RC_CRF;
param.rc.f_rf_constant = 25;
param.rc.f_rf_constant_max = 35;
//For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;
x264_param_apply_profile(¶m, "baseline");
在此之后,您可以按如下方式初始化编码器
x264_t* encoder = x264_encoder_open(¶m);
x264_picture_t pic_in, pic_out;
x264_picture_alloc(&pic_in, X264_CSP_I420, w, h)
X264需要YUV420P数据(我想其他一些也需要,但这是常见的).可以使用libswscale(来自ffmpeg)将图像转换为正确的格式.初始化过程如下(我假设RGB数据为24bpp).
struct SwsContext* convertCtx = sws_getContext(in_w, in_h, PIX_FMT_RGB24, out_w, out_h, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
编码就像这样简单,那么对于每一帧都要这样做:
//data is a pointer to you RGB structure
int srcstride = w*3; //RGB stride is just 3*width
sws_scale(convertCtx, &data, &srcstride, 0, h, pic_in.img.plane, pic_in.img.stride);
x264_nal_t* nals;
int i_nals;
int frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
if (frame_size >= 0)
{
// OK
}
我希望这能让你走;),我自己花了很长时间才开始.X264是一款功能强大但有时非常复杂的软件.
编辑:当您使用其他参数时,会出现延迟帧,而我的参数则不是这种情况(主要是由于nolatency选项).如果是这种情况,frame_size有时会为零,只要函数x264_encoder_delayed_frames
不返回0,就必须调用x264_encoder_encode
.但对于这个功能,您应该深入了解x264.c和x264.H