Декодирование потока h264 с помощью ffmpeg вызывает задержку, как ее избежать?

Я работаю над кодом, который кодирует видеопоток, отправляет его по UDP клиенту, который затем декодирует поток. Он отлично работает с кодировщиком x264, моя единственная проблема заключается в том, что когда я вызываю avcodec_decode_video2 для входящего кадра, декодер вводит задержку, как если бы у него был внутренний буфер. Как я могу этого избежать? Что контролирует это поведение? Следует ли изменить кодировщик или отсутствуют настройки в контексте декодера? В настоящее время я просто создаю контекст декодера со значениями по умолчанию avcodec_get_context_defaults3.

Кодер имеет следующие параметры:

x264_param_t param;
x264_param_default_preset(&param, preset.c_str(), "zerolatency");
param.i_frame_reference = 1;

param.i_threads = 1;
param.b_sliced_threads = 5;
param.i_slice_max_size = 8192;
param.i_width = width;
param.i_height = height;
param.i_fps_num = 30;
param.i_fps_den = 1;
param.i_sync_lookahead = 0;

param.i_bframe = 0;
// Intra refres:
param.i_keyint_max = 30;
param.b_intra_refresh = 1;
//Rate control:
param.rc.i_rc_method = X264_RC_CRF;
param.rc.i_lookahead = 0;
param.rc.i_bitrate = bitrate;
param.rc.i_vbv_max_bitrate = bitrate;
param.rc.i_vbv_buffer_size = bitrate/30;

//For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;

person Jonas Jongejan    schedule 28.04.2013    source источник


Ответы (1)


Возможно, вы используете потоковую передачу кадров во время декодирования, что приводит к буферизации кадров. Единственная другая известная мне причина - это использование B-кадров, но вы отключили их во время кодирования. Кстати "param.b_sliced_threads = 5;" выглядит странно, зная, что b_sliced_threads является логическим значением.

person nobody555    schedule 17.05.2013