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