2013-04-28 133 views
0

我正在處理一些編碼視頻源的代碼,通過UDP將它發送給客戶端,然後解碼流。它使用x264編碼器工作得很好,我唯一的問題是,當我在輸入幀上調用avcodec_decode_video2時,解碼器會引入一個延遲,就好像它有一個內部緩衝區一樣。我怎樣才能避免這種情況?什麼是控制這種行爲?它是應該更改的編碼器,還是缺少解碼器上下文中的設置?目前我只是創建了默認的解碼器上下文avcodec_get_context_defaults3用ffmpeg解碼h264流引入延遲,如何避免?

的編碼器具有以下參數:

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幀,但在編碼過程中禁用了它。順便說一句「param.b_sliced_threads = 5;」看起來很奇怪,知道b_sliced_threads是布爾值。