Как каждый использует x264 C API для кодирования изображений RBG в кадры H264? Я уже создал последовательность изображений RBG, как я могу теперь преобразовать ту последовательность в последовательность кадров H264? В частности, как я кодирую эту последовательность изображений RGB в последовательность кадра H264, состоящего из единственного начального ключевого кадра H264, сопровождаемого зависимыми кадрами H264?
Прежде всего: проверьте файл x264.h, он содержит более или менее ссылки для каждой функции и структуры. Файл 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 - безумно мощное, но иногда сложное программное обеспечение.
edit: Когда вы используете другие параметры, будут задерживаться кадры, это не относится к моим параметрам (в основном из-за опции без задержки). В этом случае frame_size иногда будет равняться нулю, и вам придется вызывать x264_encoder_encode
, пока функция x264_encoder_delayed_frames
не возвращает 0. Но для этой функции вы должны взять Подробнее о x264.c и x264.h.