diff --git a/obs/data/locale/en-US.ini b/obs/data/locale/en-US.ini index 198705528..81d72f809 100644 --- a/obs/data/locale/en-US.ini +++ b/obs/data/locale/en-US.ini @@ -335,6 +335,7 @@ Basic.Settings.Output.Advanced="Enable Advanced Encoder Settings" Basic.Settings.Output.EncoderPreset="Encoder Preset (higher = less CPU)" Basic.Settings.Output.CustomEncoderSettings="Custom Encoder Settings" Basic.Settings.Output.CustomMuxerSettings="Custom Muxer Settings" +Basic.Settings.Output.NoSpaceFileName="Generate File Name without Space" # basic mode 'output' settings - advanced section Basic.Settings.Output.Adv.Rescale="Rescale Output" diff --git a/obs/forms/OBSBasicSettings.ui b/obs/forms/OBSBasicSettings.ui index 26a562d22..42291a36c 100644 --- a/obs/forms/OBSBasicSettings.ui +++ b/obs/forms/OBSBasicSettings.ui @@ -574,7 +574,7 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + @@ -595,7 +595,7 @@ - + @@ -611,6 +611,16 @@ + + + + Basic.Settings.Output.NoSpaceFileName + + + true + + + @@ -1098,14 +1108,24 @@ - + + + + Basic.Settings.Output.NoSpaceFileName + + + true + + + + Basic.Settings.Output.Format - + @@ -1139,14 +1159,14 @@ - + Basic.Settings.Output.Adv.AudioTrack - + @@ -1198,17 +1218,17 @@ - + Basic.Settings.Output.Encoder - + - + @@ -1224,7 +1244,7 @@ - + @@ -1369,38 +1389,38 @@ - + Basic.Settings.Output.Adv.FFmpeg.Format - + - + Basic.Settings.Output.Adv.FFmpeg.FormatDesc - + - + Basic.Settings.Output.VideoBitrate - + 0 @@ -1413,7 +1433,7 @@ - + @@ -1429,7 +1449,7 @@ - + false @@ -1439,34 +1459,34 @@ - + Basic.Settings.Output.Adv.FFmpeg.VEncoder - + - + Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings - + - + Basic.Settings.Output.AudioBitrate - + 32 @@ -1482,14 +1502,14 @@ - + Basic.Settings.Output.Adv.AudioTrack - + @@ -1544,24 +1564,24 @@ - + Basic.Settings.Output.Adv.FFmpeg.AEncoder - + - + Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings - + @@ -1600,16 +1620,26 @@ - + Basic.Settings.Output.Adv.FFmpeg.MuxerSettings - + + + + + Basic.Settings.Output.NoSpaceFileName + + + true + + + diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index be1d306b7..d273c128d 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -889,17 +889,18 @@ static void get_last_log(void) } } -string GenerateTimeDateFilename(const char *extension) +string GenerateTimeDateFilename(const char *extension, bool noSpace) { time_t now = time(0); char file[256] = {}; struct tm *cur_time; cur_time = localtime(&now); - snprintf(file, sizeof(file), "%d-%02d-%02d %02d-%02d-%02d.%s", + snprintf(file, sizeof(file), "%d-%02d-%02d%c%02d-%02d-%02d.%s", cur_time->tm_year+1900, cur_time->tm_mon+1, cur_time->tm_mday, + noSpace ? '_' : ' ', cur_time->tm_hour, cur_time->tm_min, cur_time->tm_sec, diff --git a/obs/obs-app.hpp b/obs/obs-app.hpp index 93bf53c06..5fa2f7c73 100644 --- a/obs/obs-app.hpp +++ b/obs/obs-app.hpp @@ -33,7 +33,7 @@ std::string CurrentTimeString(); std::string CurrentDateTimeString(); -std::string GenerateTimeDateFilename(const char *extension); +std::string GenerateTimeDateFilename(const char *extension, bool noSpace=false); QObject *CreateShortcutFilter(); struct BaseLexer { diff --git a/obs/window-basic-main-outputs.cpp b/obs/window-basic-main-outputs.cpp index 52401a756..3f81230b3 100644 --- a/obs/window-basic-main-outputs.cpp +++ b/obs/window-basic-main-outputs.cpp @@ -430,6 +430,8 @@ bool SimpleOutput::StartRecording() "SimpleOutput", "RecFormat"); const char *mux = config_get_string(main->Config(), "SimpleOutput", "MuxerCustom"); + bool noSpace = config_get_bool(main->Config(), "SimpleOutput", + "FileNameWithoutSpace"); os_dir_t *dir = path ? os_opendir(path) : nullptr; @@ -449,7 +451,8 @@ bool SimpleOutput::StartRecording() if (lastChar != '/' && lastChar != '\\') strPath += "/"; - strPath += GenerateTimeDateFilename(ffmpegOutput ? "avi" : format); + strPath += GenerateTimeDateFilename(ffmpegOutput ? "avi" : format, + noSpace); SetupOutputs(); @@ -931,6 +934,7 @@ bool AdvancedOutput::StartRecording() { const char *path; const char *format; + bool noSpace = false; if (!useStreamEncoder) { if (!ffmpegOutput) { @@ -950,6 +954,10 @@ bool AdvancedOutput::StartRecording() ffmpegRecording ? "FFFilePath" : "RecFilePath"); format = config_get_string(main->Config(), "AdvOut", ffmpegRecording ? "FFExtension" : "RecFormat"); + noSpace = config_get_bool(main->Config(), "AdvOut", + ffmpegRecording ? + "FFFileNameWithoutSpace" : + "RecFileNameWithoutSpace"); os_dir_t *dir = path ? os_opendir(path) : nullptr; @@ -969,7 +977,7 @@ bool AdvancedOutput::StartRecording() if (lastChar != '/' && lastChar != '\\') strPath += "/"; - strPath += GenerateTimeDateFilename(format); + strPath += GenerateTimeDateFilename(format, noSpace); obs_data_t *settings = obs_data_create(); obs_data_set_string(settings, diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index aa45b07df..0ad7c70dc 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -266,6 +266,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED); HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->simpleNoSpace, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->simpleOutRecFormat, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->simpleOutputVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->simpleOutputABitrate, COMBO_CHANGED, OUTPUTS_CHANGED); @@ -285,6 +286,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->advOutApplyService, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecType, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecPath, EDIT_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->advOutNoSpace, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecFormat, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecEncoder, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED); @@ -296,6 +298,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->advOutRecTrack4, 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); HookWidget(ui->advOutFFURL, EDIT_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutFFFormat, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutFFMCfg, EDIT_CHANGED, OUTPUTS_CHANGED); @@ -1011,6 +1014,8 @@ void OBSBasicSettings::LoadSimpleOutputSettings() { const char *path = config_get_string(main->Config(), "SimpleOutput", "FilePath"); + bool noSpace = config_get_bool(main->Config(), "SimpleOutput", + "FileNameWithoutSpace"); const char *format = config_get_string(main->Config(), "SimpleOutput", "RecFormat"); int videoBitrate = config_get_uint(main->Config(), "SimpleOutput", @@ -1033,6 +1038,7 @@ void OBSBasicSettings::LoadSimpleOutputSettings() audioBitrate = FindClosestAvailableAACBitrate(audioBitrate); ui->simpleOutputPath->setText(path); + ui->simpleNoSpace->setChecked(noSpace); ui->simpleOutputVBitrate->setValue(videoBitrate); int idx = ui->simpleOutRecFormat->findText(format); @@ -1133,6 +1139,8 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() "RecFormat"); const char *path = config_get_string(main->Config(), "AdvOut", "RecFilePath"); + bool noSpace = config_get_bool(main->Config(), "AdvOut", + "RecFileNameWithoutSpace"); bool rescale = config_get_bool(main->Config(), "AdvOut", "RecRescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", @@ -1144,6 +1152,7 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() int typeIndex = (astrcmpi(type, "FFmpeg") == 0) ? 1 : 0; ui->advOutRecType->setCurrentIndex(typeIndex); ui->advOutRecPath->setText(path); + ui->advOutNoSpace->setChecked(noSpace); ui->advOutRecUseRescale->setChecked(rescale); ui->advOutRecRescale->setCurrentText(rescaleRes); ui->advOutMuxCustom->setText(muxCustom); @@ -1205,6 +1214,8 @@ void OBSBasicSettings::LoadAdvOutputFFmpegSettings() "FFOutputToFile"); const char *path = config_get_string(main->Config(), "AdvOut", "FFFilePath"); + bool noSpace = config_get_bool(main->Config(), "AdvOut", + "FFFileNameWithoutSpace"); const char *url = config_get_string(main->Config(), "AdvOut", "FFURL"); const char *format = config_get_string(main->Config(), "AdvOut", "FFFormat"); @@ -1237,6 +1248,7 @@ void OBSBasicSettings::LoadAdvOutputFFmpegSettings() ui->advOutFFType->setCurrentIndex(saveFile ? 0 : 1); ui->advOutFFRecPath->setText(QT_UTF8(path)); + ui->advOutFFNoSpace->setChecked(noSpace); ui->advOutFFURL->setText(QT_UTF8(url)); SelectFormat(ui->advOutFFFormat, format, mimeType); ui->advOutFFMCfg->setText(muxCustom); @@ -2126,6 +2138,7 @@ void OBSBasicSettings::SaveOutputSettings() SaveSpinBox(ui->simpleOutputVBitrate, "SimpleOutput", "VBitrate"); SaveCombo(ui->simpleOutputABitrate, "SimpleOutput", "ABitrate"); SaveEdit(ui->simpleOutputPath, "SimpleOutput", "FilePath"); + SaveCheckBox(ui->simpleNoSpace, "SimpleOutput", "FileNameWithoutSpace"); SaveCombo(ui->simpleOutRecFormat, "SimpleOutput", "RecFormat"); SaveCheckBox(ui->simpleOutAdvanced, "SimpleOutput", "UseAdvanced"); SaveCombo(ui->simpleOutPreset, "SimpleOutput", "Preset"); @@ -2146,6 +2159,7 @@ void OBSBasicSettings::SaveOutputSettings() RecTypeFromIdx(ui->advOutRecType->currentIndex())); SaveEdit(ui->advOutRecPath, "AdvOut", "RecFilePath"); + SaveCheckBox(ui->advOutNoSpace, "AdvOut", "RecFileNameWithoutSpace"); SaveCombo(ui->advOutRecFormat, "AdvOut", "RecFormat"); SaveComboData(ui->advOutRecEncoder, "AdvOut", "RecEncoder"); SaveCheckBox(ui->advOutRecUseRescale, "AdvOut", "RecRescale"); @@ -2161,6 +2175,7 @@ void OBSBasicSettings::SaveOutputSettings() config_set_bool(main->Config(), "AdvOut", "FFOutputToFile", ui->advOutFFType->currentIndex() == 0 ? true : false); SaveEdit(ui->advOutFFRecPath, "AdvOut", "FFFilePath"); + SaveCheckBox(ui->advOutFFNoSpace, "AdvOut", "FFFileNameWithoutSpace"); SaveEdit(ui->advOutFFURL, "AdvOut", "FFURL"); SaveFormat(ui->advOutFFFormat); SaveEdit(ui->advOutFFMCfg, "AdvOut", "FFMCustom"); @@ -2550,6 +2565,11 @@ void OBSBasicSettings::on_advOutFFVEncoder_currentIndexChanged(int idx) } } +void OBSBasicSettings::on_advOutFFType_currentIndexChanged(int idx) +{ + ui->advOutFFNoSpace->setHidden(idx != 0); +} + void OBSBasicSettings::on_colorFormat_currentIndexChanged(const QString &text) { bool usingNV12 = text == "NV12"; diff --git a/obs/window-basic-settings.hpp b/obs/window-basic-settings.hpp index 662fe601c..96be12d18 100644 --- a/obs/window-basic-settings.hpp +++ b/obs/window-basic-settings.hpp @@ -245,6 +245,7 @@ private slots: void on_advOutFFFormat_currentIndexChanged(int idx); void on_advOutFFAEncoder_currentIndexChanged(int idx); void on_advOutFFVEncoder_currentIndexChanged(int idx); + void on_advOutFFType_currentIndexChanged(int idx); void on_colorFormat_currentIndexChanged(const QString &text);