I'm new to video coding, I found this https://github.com/RafaelPalomar/H264LiveStreamer application code very useful to my project. I want to live stream a webcam over RTP . However, I'm having problem selecting the Frame Per Seconds (FPS). below is the function that controls the encoding param.
void x264Encoder::initilize()
{
x264_param_default_preset(¶meters, "veryfast", "zerolatency");
parameters.i_log_level = X264_LOG_DEBUG;
parameters.i_threads = 1;
parameters.i_width = 640;
parameters.i_height = 480;
parameters.i_fps_num = 25;
parameters.i_fps_den = 1;
parameters.i_keyint_max = 25;
parameters.b_intra_refresh = 1;
parameters.rc.i_rc_method = X264_RC_CRF;
parameters.rc.i_vbv_buffer_size = 1000000;
parameters.rc.i_vbv_max_bitrate = 90000;
parameters.rc.f_rf_constant = 25;
parameters.rc.f_rf_constant_max = 35;
parameters.i_sps_id = 7;
// the following two value you should keep 1
parameters.b_repeat_headers = 1; // to get header before every I-Frame
parameters.b_annexb = 1; // put start code in front of nal. we will remove start code later
x264_param_apply_profile(¶meters, "baseline");
encoder = x264_encoder_open(¶meters);
x264_picture_alloc(&picture_in, X264_CSP_I420, parameters.i_width, parameters.i_height);
picture_in.i_type = X264_TYPE_AUTO;
picture_in.img.i_csp = X264_CSP_I420;
// i have initilized my color space converter for BGR24 to YUV420 because my opencv video capture gives BGR24 image. You can initilize according to your input pixelFormat
convertContext = sws_getContext(parameters.i_width,parameters.i_height, PIX_FMT_BGR24, parameters.i_width,parameters.i_height,PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
}
I'm using VLC as client whatever number i set i_fps_num to, I always get 12-14 FPS. fore example, in VLC Codec tab shows 25 FPS but in Stream statistics tab it shows it only display 13 FPS on average. here is the X264 encoder output
x264 [debug]: frame= 72 QP=22.24 NAL=2 Slice:P Poc:144 I:97 P:116 SKIP:987 size=1464 bytes
x264 [info]: frame I:1 Avg QP:20.06 size: 17848
x264 [info]: frame P:72 Avg QP:22.12 size: 1337
x264 [info]: mb I I16..4: 40.2% 0.0% 59.8%
x264 [info]: mb P I16..4: 3.1% 0.0% 2.3% P16..4: 8.3% 2.0% 0.6% 0.0% 0.0% skip:83.7%
x264 [info]: coded y,uvDC,uvAC intra: 53.6% 46.4% 7.4% inter: 3.0% 1.6% 0.0%
x264 [info]: i16 v,h,dc,p: 11% 65% 12% 12%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 46% 16% 3% 4% 3% 5% 3% 6%
x264 [info]: i8c dc,h,v,p: 46% 42% 10% 2%
x264 [info]: kb/s:312.60
the last frame number that was encoded is 72 while in VLC stream statistics it shows that 133 frames are Displayed and 66 blocks are decoded for 10 seconds streaming in addition the video playback is bursty.
my question is how to change the x264 parameters to get 25 FPS ?
I suspect your computer cannot encode 25 fps in real-time. You are using one thread - this might be the bottleneck. Could you try encode offline with the same settings and check the encode speed?
Also there might be frame rate issues with video capture / video camera. Try pipeline with video capture and immediate playback on a screen (no encoding) to make sure your camera is able to do 25 fps.