diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index e3a72901b..634f533d0 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -935,7 +935,6 @@ SceneItemHide="Hide '%1'"
# Output warnings
OutputWarnings.NoTracksSelected="You must select at least one track"
-OutputWarnings.MultiTrackRecording="Warning: Certain formats (such as FLV) do not support multiple tracks per recording"
OutputWarnings.MP4Recording="Warning: Recordings saved to MP4/MOV will be unrecoverable if the file cannot be finalized (e.g. as a result of BSODs, power losses, etc.). If you want to record multiple audio tracks consider using MKV and remux the recording to MP4/MOV after it is finished (File → Remux Recordings)"
OutputWarnings.CannotPause="Warning: Recordings cannot be paused if the recording encoder is set to \"(Use stream encoder)\""
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 4ca2c4a56..f096bd398 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -1849,6 +1849,55 @@
+ -
+
+
+ Basic.Settings.Output.Encoder
+
+
+ advOutEncoder
+
+
+
+ -
+
+
+ -
+
+
+ Basic.Settings.Output.Adv.ApplyServiceSettings
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::RightToLeft
+
+
+ Basic.Settings.Output.Adv.Rescale
+
+
+
+ -
+
+
+ false
+
+
+ true
+
+
+
-
@@ -1918,55 +1967,6 @@
- -
-
-
- Basic.Settings.Output.Encoder
-
-
- advOutEncoder
-
-
-
- -
-
-
- -
-
-
- Basic.Settings.Output.Adv.ApplyServiceSettings
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Qt::RightToLeft
-
-
- Basic.Settings.Output.Adv.Rescale
-
-
-
- -
-
-
- false
-
-
- true
-
-
-
@@ -2187,72 +2187,6 @@
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- 1
-
-
-
- -
-
-
- 2
-
-
-
- -
-
-
- 3
-
-
-
- -
-
-
- 4
-
-
-
- -
-
-
- 5
-
-
-
- -
-
-
- 6
-
-
-
-
-
-
-
@@ -2323,6 +2257,133 @@
-
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 1
+
+
+
+ -
+
+
+ 2
+
+
+
+ -
+
+
+ 3
+
+
+
+ -
+
+
+ 4
+
+
+
+ -
+
+
+ 5
+
+
+
+ -
+
+
+ 6
+
+
+
+
+
+
+
+
+
+ 9
+ 0
+ 221
+ 21
+
+
+
+ -
+
+
+ 1
+
+
+
+ -
+
+
+ 2
+
+
+
+ -
+
+
+ 3
+
+
+
+ -
+
+
+ 4
+
+
+
+ -
+
+
+ 5
+
+
+
+ -
+
+
+ 6
+
+
+
+
+
+
+
+
diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp
index ede9733a7..dfb8b1977 100644
--- a/UI/window-basic-main-outputs.cpp
+++ b/UI/window-basic-main-outputs.cpp
@@ -1305,7 +1305,18 @@ inline void AdvancedOutput::SetupRecording()
bool rescale = config_get_bool(main->Config(), "AdvOut", "RecRescale");
const char *rescaleRes =
config_get_string(main->Config(), "AdvOut", "RecRescaleRes");
- int tracks = config_get_int(main->Config(), "AdvOut", "RecTracks");
+ int tracks;
+
+ const char *recFormat =
+ config_get_string(main->Config(), "AdvOut", "RecFormat");
+
+ bool flv = strcmp(recFormat, "flv") == 0;
+
+ if (flv)
+ tracks = config_get_int(main->Config(), "AdvOut", "FLVTrack");
+ else
+ tracks = config_get_int(main->Config(), "AdvOut", "RecTracks");
+
obs_data_t *settings = obs_data_create();
unsigned int cx = 0;
unsigned int cy = 0;
@@ -1340,15 +1351,24 @@ inline void AdvancedOutput::SetupRecording()
h264Recording);
}
- for (int i = 0; i < MAX_AUDIO_MIXES; i++) {
- if ((tracks & (1 << i)) != 0) {
- obs_output_set_audio_encoder(fileOutput, aacTrack[i],
- idx);
- if (replayBuffer)
- obs_output_set_audio_encoder(replayBuffer,
+ if (!flv) {
+ for (int i = 0; i < MAX_AUDIO_MIXES; i++) {
+ if ((tracks & (1 << i)) != 0) {
+ obs_output_set_audio_encoder(fileOutput,
aacTrack[i], idx);
- idx++;
+ if (replayBuffer)
+ obs_output_set_audio_encoder(
+ replayBuffer, aacTrack[i], idx);
+ idx++;
+ }
}
+ } else if (flv && tracks != 0) {
+ obs_output_set_audio_encoder(fileOutput, aacTrack[tracks - 1],
+ idx);
+
+ if (replayBuffer)
+ obs_output_set_audio_encoder(replayBuffer,
+ aacTrack[tracks - 1], idx);
}
obs_data_set_string(settings, "path", path);
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index 200a9cb5d..5abb2e96a 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -1243,6 +1243,7 @@ bool OBSBasic::InitBasicConfigDefaults()
config_set_default_bool(basicConfig, "AdvOut", "RecUseRescale", false);
config_set_default_uint(basicConfig, "AdvOut", "RecTracks", (1 << 0));
config_set_default_string(basicConfig, "AdvOut", "RecEncoder", "none");
+ config_set_default_uint(basicConfig, "AdvOut", "FLVTrack", 1);
config_set_default_bool(basicConfig, "AdvOut", "FFOutputToFile", true);
config_set_default_string(basicConfig, "AdvOut", "FFFilePath",
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index d62f31263..5dae7b6ba 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -381,6 +381,12 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->advOutRecTrack4, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutRecTrack5, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutRecTrack6, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack1, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack2, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack3, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack4, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack5, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->flvTrack6, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFType, COMBO_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFRecPath, EDIT_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutFFNoSpace, CHECK_CHANGED, OUTPUTS_CHANGED);
@@ -1692,6 +1698,7 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings()
const char *muxCustom =
config_get_string(main->Config(), "AdvOut", "RecMuxerCustom");
int tracks = config_get_int(main->Config(), "AdvOut", "RecTracks");
+ int flvTrack = config_get_int(main->Config(), "AdvOut", "FLVTrack");
int typeIndex = (astrcmpi(type, "FFmpeg") == 0) ? 1 : 0;
ui->advOutRecType->setCurrentIndex(typeIndex);
@@ -1710,6 +1717,30 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings()
ui->advOutRecTrack4->setChecked(tracks & (1 << 3));
ui->advOutRecTrack5->setChecked(tracks & (1 << 4));
ui->advOutRecTrack6->setChecked(tracks & (1 << 5));
+
+ switch (flvTrack) {
+ case 1:
+ ui->flvTrack1->setChecked(true);
+ break;
+ case 2:
+ ui->flvTrack2->setChecked(true);
+ break;
+ case 3:
+ ui->flvTrack3->setChecked(true);
+ break;
+ case 4:
+ ui->flvTrack4->setChecked(true);
+ break;
+ case 5:
+ ui->flvTrack5->setChecked(true);
+ break;
+ case 6:
+ ui->flvTrack6->setChecked(true);
+ break;
+ default:
+ ui->flvTrack1->setChecked(true);
+ break;
+ }
}
void OBSBasicSettings::LoadAdvOutputRecordingEncoderProperties()
@@ -3171,6 +3202,8 @@ void OBSBasicSettings::SaveOutputSettings()
(ui->advOutRecTrack5->isChecked() ? (1 << 4) : 0) |
(ui->advOutRecTrack6->isChecked() ? (1 << 5) : 0));
+ config_set_int(main->Config(), "AdvOut", "FLVTrack", CurrentFLVTrack());
+
config_set_bool(main->Config(), "AdvOut", "FFOutputToFile",
ui->advOutFFType->currentIndex() == 0 ? true : false);
SaveEdit(ui->advOutFFRecPath, "AdvOut", "FFFilePath");
@@ -3953,13 +3986,6 @@ void OBSBasicSettings::AdvOutRecCheckWarnings()
Checked(ui->advOutRecTrack3) + Checked(ui->advOutRecTrack4) +
Checked(ui->advOutRecTrack5) + Checked(ui->advOutRecTrack6);
- if (tracks == 0) {
- errorMsg = QTStr("OutputWarnings.NoTracksSelected");
-
- } else if (tracks > 1) {
- warningMsg = QTStr("OutputWarnings.MultiTrackRecording");
- }
-
bool useStreamEncoder = ui->advOutRecEncoder->currentIndex() == 0;
if (useStreamEncoder) {
if (!warningMsg.isEmpty())
@@ -3967,6 +3993,15 @@ void OBSBasicSettings::AdvOutRecCheckWarnings()
warningMsg += QTStr("OutputWarnings.CannotPause");
}
+ if (ui->advOutRecFormat->currentText().compare("flv") == 0) {
+ ui->advRecTrackWidget->setCurrentWidget(ui->flvTracks);
+ } else {
+ ui->advRecTrackWidget->setCurrentWidget(ui->recTracks);
+
+ if (tracks == 0)
+ errorMsg = QTStr("OutputWarnings.NoTracksSelected");
+ }
+
if (ui->advOutRecFormat->currentText().compare("mp4") == 0 ||
ui->advOutRecFormat->currentText().compare("mov") == 0) {
if (!warningMsg.isEmpty())
@@ -4609,3 +4644,21 @@ void OBSBasicSettings::SetAdvancedIcon(const QIcon &icon)
{
ui->listWidget->item(6)->setIcon(icon);
}
+
+int OBSBasicSettings::CurrentFLVTrack()
+{
+ if (ui->flvTrack1->isChecked())
+ return 1;
+ else if (ui->flvTrack2->isChecked())
+ return 2;
+ else if (ui->flvTrack3->isChecked())
+ return 3;
+ else if (ui->flvTrack4->isChecked())
+ return 4;
+ else if (ui->flvTrack5->isChecked())
+ return 5;
+ else if (ui->flvTrack6->isChecked())
+ return 6;
+
+ return 0;
+}
diff --git a/UI/window-basic-settings.hpp b/UI/window-basic-settings.hpp
index 0889d47ef..935581704 100644
--- a/UI/window-basic-settings.hpp
+++ b/UI/window-basic-settings.hpp
@@ -300,6 +300,8 @@ private:
QIcon GetHotkeysIcon() const;
QIcon GetAdvancedIcon() const;
+ int CurrentFLVTrack();
+
private slots:
void on_theme_activated(int idx);