diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index f45096fa5..afe988feb 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -538,6 +538,7 @@ Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video Encoder Settings (if an
Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Encoder"
Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Encoder Settings (if any)"
Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer Settings (if any)"
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe interval (frames)"
# basic mode 'output' settings - advanced section - recording subsection - completer
FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 910696a39..d8e860e77 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -1951,7 +1951,30 @@
+ -
+
+
+ 1000000000
+
+
+ 250
+
+
+
-
+
+
+ Basic.Settings.Output.Adv.FFmpeg.GOPSize
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ advOutFFVGOPSize
+
+
+
+ -
@@ -1967,7 +1990,7 @@
- -
+
-
false
@@ -1977,7 +2000,7 @@
- -
+
-
Basic.Settings.Output.Adv.FFmpeg.VEncoder
@@ -1987,10 +2010,10 @@
- -
+
-
- -
+
-
Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings
@@ -2000,10 +2023,10 @@
- -
+
-
- -
+
-
Basic.Settings.Output.AudioBitrate
@@ -2013,7 +2036,7 @@
- -
+
-
32
@@ -2029,14 +2052,14 @@
- -
+
-
Basic.Settings.Output.Adv.AudioTrack
- -
+
-
@@ -2105,7 +2128,7 @@
- -
+
-
Basic.Settings.Output.Adv.FFmpeg.AEncoder
@@ -2115,10 +2138,10 @@
- -
+
-
- -
+
-
Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings
@@ -2128,7 +2151,7 @@
- -
+
-
-
@@ -4132,6 +4155,7 @@
advOutFFURL
advOutFFFormat
advOutFFVBitrate
+ advOutFFVGOPSize
advOutFFUseRescale
advOutFFRescale
advOutFFVEncoder
diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp
index 27a5f9b4f..8d3d7a944 100644
--- a/UI/window-basic-main-outputs.cpp
+++ b/UI/window-basic-main-outputs.cpp
@@ -1170,6 +1170,8 @@ inline void AdvancedOutput::SetupFFmpeg()
const char *url = config_get_string(main->Config(), "AdvOut", "FFURL");
int vBitrate = config_get_int(main->Config(), "AdvOut",
"FFVBitrate");
+ int gopSize = config_get_int(main->Config(), "AdvOut",
+ "FFVGOPSize");
bool rescale = config_get_bool(main->Config(), "AdvOut",
"FFRescale");
const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
@@ -1202,6 +1204,7 @@ inline void AdvancedOutput::SetupFFmpeg()
obs_data_set_string(settings, "format_name", formatName);
obs_data_set_string(settings, "format_mime_type", mimeType);
obs_data_set_string(settings, "muxer_settings", muxCustom);
+ obs_data_set_int(settings, "gop_size", gopSize);
obs_data_set_int(settings, "video_bitrate", vBitrate);
obs_data_set_string(settings, "video_encoder", vEncoder);
obs_data_set_int(settings, "video_encoder_id", vEncoderId);
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index 00be4407c..0e213c86a 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -974,6 +974,7 @@ bool OBSBasic::InitBasicConfigDefaults()
GetDefaultVideoSavePath().c_str());
config_set_default_string(basicConfig, "AdvOut", "FFExtension", "mp4");
config_set_default_uint (basicConfig, "AdvOut", "FFVBitrate", 2500);
+ config_set_default_uint (basicConfig, "AdvOut", "FFVGOPSize", 250);
config_set_default_bool (basicConfig, "AdvOut", "FFUseRescale",
false);
config_set_default_uint (basicConfig, "AdvOut", "FFABitrate", 160);
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index a2db7ea05..d0b436013 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -340,6 +340,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->advOutFFFormat, COMBO_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFMCfg, EDIT_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->advOutFFVGOPSize, SCROLL_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFVEncoder, COMBO_CHANGED, OUTPUTS_CHANGED);
@@ -1558,6 +1559,8 @@ void OBSBasicSettings::LoadAdvOutputFFmpegSettings()
"FFMCustom");
int videoBitrate = config_get_int(main->Config(), "AdvOut",
"FFVBitrate");
+ int gopSize = config_get_int(main->Config(), "AdvOut",
+ "FFVGOPSize");
bool rescale = config_get_bool(main->Config(), "AdvOut",
"FFRescale");
const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
@@ -1586,6 +1589,7 @@ void OBSBasicSettings::LoadAdvOutputFFmpegSettings()
SelectFormat(ui->advOutFFFormat, format, mimeType);
ui->advOutFFMCfg->setText(muxCustom);
ui->advOutFFVBitrate->setValue(videoBitrate);
+ ui->advOutFFVGOPSize->setValue(gopSize);
ui->advOutFFUseRescale->setChecked(rescale);
ui->advOutFFRescale->setEnabled(rescale);
ui->advOutFFRescale->setCurrentText(rescaleRes);
@@ -1701,6 +1705,7 @@ void OBSBasicSettings::SetAdvOutputFFmpegEnablement(
switch (encoderType) {
case FF_CODEC_VIDEO:
ui->advOutFFVBitrate->setEnabled(enabled);
+ ui->advOutFFVGOPSize->setEnabled(enabled);
ui->advOutFFUseRescale->setEnabled(enabled);
ui->advOutFFRescale->setEnabled(enabled && rescale);
ui->advOutFFVEncoder->setEnabled(enabled || enableEncoder);
@@ -2746,6 +2751,7 @@ void OBSBasicSettings::SaveOutputSettings()
SaveFormat(ui->advOutFFFormat);
SaveEdit(ui->advOutFFMCfg, "AdvOut", "FFMCustom");
SaveSpinBox(ui->advOutFFVBitrate, "AdvOut", "FFVBitrate");
+ SaveSpinBox(ui->advOutFFVGOPSize, "AdvOut", "FFVGOPSize");
SaveCheckBox(ui->advOutFFUseRescale, "AdvOut", "FFRescale");
SaveCombo(ui->advOutFFRescale, "AdvOut", "FFRescaleRes");
SaveEncoder(ui->advOutFFVEncoder, "AdvOut", "FFVEncoder");