2013-04-28 4 views
0

Je travaille sur du code qui code un flux vidéo, l'envoie via UDP à un client qui décode ensuite le flux. Cela fonctionne bien en utilisant un encodeur x264, mon seul problème est que quand j'appelle avcodec_decode_video2 sur la trame incomming, le décodeur introduit un retard comme s'il avait un tampon interne. Comment puis-je éviter ça? Qu'est-ce qui contrôle ce comportement? Est-ce l'encodeur qui devrait être changé, ou est-ce qu'il manque des paramètres dans le contexte du décodeur? Actuellement, je crée simplement le contexte du décodeur avec les valeurs par défaut avcodec_get_context_defaults3.Decode h264 flux avec ffmpeg introduit un délai, comment éviter?

Le codeur a les paramètres suivants:

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; 

Répondre

0

Peut être que vous utilisez cadre-threading lors du décodage et que la cause en mémoire tampon de trame. La seule autre raison que je connaisse est l'utilisation de B-frames mais vous l'avez désactivée lors de l'encodage. Btw "param.b_sliced_threads = 5;" semble étrange sachant que b_sliced_threads est une valeur booléenne.

Questions connexes