diff --git a/src/nvenc/nvenc_base.cpp b/src/nvenc/nvenc_base.cpp index cecb5e35..f6c74fbf 100644 --- a/src/nvenc/nvenc_base.cpp +++ b/src/nvenc/nvenc_base.cpp @@ -409,9 +409,20 @@ namespace nvenc { void nvenc_base::update_bitrate(int bitrate) { + auto get_encoder_cap = [&](NV_ENC_CAPS cap) { + NV_ENC_CAPS_PARAM param = { NV_ENC_CAPS_PARAM_VER, cap }; + int value = 0; + nvenc->nvEncGetEncodeCaps(encoder, init_params.encodeGUID, ¶m, &value); + return value; + }; + + NV_ENC_RECONFIGURE_PARAMS reconfigure_params = { NV_ENC_RECONFIGURE_PARAMS_VER }; /* reset rate control state and start from IDR */ - init_params.encodeConfig->rcParams.averageBitRate = bitrate; + init_params.encodeConfig->rcParams.averageBitRate = bitrate * 1000; + if (get_encoder_cap(NV_ENC_CAPS_SUPPORT_CUSTOM_VBV_BUF_SIZE)) { + init_params.encodeConfig->rcParams.vbvBufferSize = bitrate * 1000 / init_params.frameRateNum; + } reconfigure_params.reInitEncodeParams = init_params; reconfigure_params.resetEncoder = TRUE; reconfigure_params.forceIDR = TRUE; diff --git a/src/video.cpp b/src/video.cpp index a0ada49b..93ac253b 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -446,9 +446,10 @@ namespace video { void update_bitrate(int bitrate) override { - // bitrate = bitrate * 1000; - // avcodec_ctx->rc_max_rate = bitrate; - // avcodec_ctx->bit_rate = bitrate; + bitrate = bitrate * 1000; + avcodec_ctx->rc_max_rate = bitrate; + avcodec_ctx->bit_rate = bitrate; + avcodec_ctx->rc_min_rate = bitrate; } void