Как каждый кодирует ряд изображений в H264 с помощью x264 C API?

Как каждый использует x264 C API для кодирования изображений RBG в кадры H264? Я уже создал последовательность изображений RBG, как я могу теперь преобразовать ту последовательность в последовательность кадров H264? В частности, как я кодирую эту последовательность изображений RGB в последовательность кадра H264, состоящего из единственного начального ключевого кадра H264, сопровождаемого зависимыми кадрами H264?

61
задан Nate Chandler 27 April 2012 в 01:38
поделиться

1 ответ

Прежде всего: проверьте файл 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(&param, "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(&param, "baseline");

После этого вы можете инициализировать кодировщик следующим образом

x264_t* encoder = x264_encoder_open(&param);
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.

93
ответ дан 24 November 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: