2013-04-28 2 views
0

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

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

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; 

ответ

0

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