Потоковое видео-управление частотой кадров x264
Я новичок в кодировании видео, я нашел это https://github.com/RafaelPalomar/H264LiveStreamer код приложения очень полезен для моего проекта. Я хочу в прямом эфире транслировать веб-камеру через RTP . Однако у меня возникли проблемы с выбором кадра в секунду (FPS). ниже приведена функция, управляющая параметром кодирования.
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);
}
Я использую VLC в качестве клиента, какое бы число я ни установил i_fps_num, я всегда получаю 12-14 кадров в секунду. например, в разделе в VLC кодек показывает 25 фпс, но вкладка в потоке статистики показывает, что он показывает только 13 кадров в секунду в среднем. вот выход кодера X264
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
Последний номер кадра, который был закодирован, равен 72, в то время как в статистике потока VLC он показывает, что 133 кадра отображаются и 66 блоков декодируются в течение 10 секунд потоковой передачи, кроме того, воспроизведение видео является бурным.
Мой вопрос в том, как изменить параметры x264, чтобы получить 25 кадров в секунду ?
1 ответ:
Я подозреваю, что ваш компьютер не может кодировать 25 кадров в секунду в режиме реального времени. Вы используете один поток-это может быть узким местом. Не могли бы вы попробовать кодировать в автономном режиме с теми же настройками и проверить скорость кодирования?
Также могут возникнуть проблемы с частотой кадров при съемке видео / видеокамерой. Попробуйте pipeline с захватом видео и немедленным воспроизведением на экране (без кодирования), чтобы убедиться, что ваша камера способна делать 25 кадров в секунду.