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);