|
@@ -49,9 +49,9 @@ int encoder_video_nvenc::init(
|
|
|
// ffmpeg -h encoder=h264_nvenc show all encoder options
|
|
// ffmpeg -h encoder=h264_nvenc show all encoder options
|
|
|
|
|
|
|
|
const char *rate_control = "cbr"; // cbr | cqp | vbr | lossless
|
|
const char *rate_control = "cbr"; // cbr | cqp | vbr | lossless
|
|
|
- const char *profile = "baseline"; // baseline | main | high |high444p
|
|
|
|
|
- const char *preset = "ultrafast"; // default | slow | medium | fast |
|
|
|
|
|
- // hp | hq | bd | 11 | 11hq | 11hp | lossless | losslesshp
|
|
|
|
|
|
|
+ const char *profile = "high"; // baseline | main | high | high444p
|
|
|
|
|
+ const char *preset = "ll"; // NVENC 低延迟预设:ll | llhq | llhp 等
|
|
|
|
|
+ // hp | hq | bd | 11 | 11hq | 11hp | lossless | losslesshp
|
|
|
|
|
|
|
|
#if 0 //USE_CBR
|
|
#if 0 //USE_CBR
|
|
|
av_opt_set_int(_encoder_ctx->priv_data, "cbr", true, 0);
|
|
av_opt_set_int(_encoder_ctx->priv_data, "cbr", true, 0);
|
|
@@ -73,11 +73,11 @@ int encoder_video_nvenc::init(
|
|
|
|
|
|
|
|
av_opt_set(_encoder_ctx->priv_data, "profile", profile, 0);
|
|
av_opt_set(_encoder_ctx->priv_data, "profile", profile, 0);
|
|
|
av_opt_set(_encoder_ctx->priv_data, "preset", preset, 0);
|
|
av_opt_set(_encoder_ctx->priv_data, "preset", preset, 0);
|
|
|
-+ // use NVENC low-latency tune and disable lookahead for minimum latency
|
|
|
|
|
-+ av_opt_set(_encoder_ctx->priv_data, "tune", "ll", 0);
|
|
|
|
|
-+ av_opt_set_int(_encoder_ctx->priv_data, "rc-lookahead", 0, 0);
|
|
|
|
|
-
|
|
|
|
|
- av_opt_set(_encoder_ctx->priv_data, "level", "auto", 0);
|
|
|
|
|
|
|
+ // NVENC 低延迟优化:开启低延迟tune并关闭lookahead
|
|
|
|
|
+ av_opt_set(_encoder_ctx->priv_data, "tune", "ll", 0);
|
|
|
|
|
+ av_opt_set_int(_encoder_ctx->priv_data, "rc-lookahead", 0, 0);
|
|
|
|
|
+
|
|
|
|
|
+ av_opt_set(_encoder_ctx->priv_data, "level", "4.1", 0);
|
|
|
av_opt_set_int(_encoder_ctx->priv_data, "2pass", false, 0);
|
|
av_opt_set_int(_encoder_ctx->priv_data, "2pass", false, 0);
|
|
|
av_opt_set_int(_encoder_ctx->priv_data, "gpu", 0, 0);
|
|
av_opt_set_int(_encoder_ctx->priv_data, "gpu", 0, 0);
|
|
|
|
|
|
|
@@ -85,14 +85,14 @@ int encoder_video_nvenc::init(
|
|
|
_encoder_ctx->height = pic_height;
|
|
_encoder_ctx->height = pic_height;
|
|
|
_encoder_ctx->time_base.num = 1;
|
|
_encoder_ctx->time_base.num = 1;
|
|
|
_encoder_ctx->time_base.den = frame_rate;
|
|
_encoder_ctx->time_base.den = frame_rate;
|
|
|
- _encoder_ctx->framerate = {frame_rate, 1};
|
|
|
|
|
|
|
+ _encoder_ctx->framerate.num = frame_rate;
|
|
|
|
|
+ _encoder_ctx->framerate.den = 1;
|
|
|
_encoder_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
|
_encoder_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
|
|
|
|
|
|
|
if (key_pic_sec == 0)
|
|
if (key_pic_sec == 0)
|
|
|
- _encoder_ctx->gop_size = 250;
|
|
|
|
|
|
|
+ _encoder_ctx->gop_size = 30; // 固定为30帧,与x264一致
|
|
|
else
|
|
else
|
|
|
- _encoder_ctx->gop_size = key_pic_sec * _encoder_ctx->time_base.den
|
|
|
|
|
- / _encoder_ctx->time_base.num;
|
|
|
|
|
|
|
+ _encoder_ctx->gop_size = 30; // 固定为30帧,与x264一致
|
|
|
|
|
|
|
|
_encoder_ctx->max_b_frames = 0; //NO B Frame
|
|
_encoder_ctx->max_b_frames = 0; //NO B Frame
|
|
|
_encoder_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
|
_encoder_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|