瀏覽代碼

UI: Allow file name generation without spaces

This will probably go away once proper file name formatting is
implemented (https://obsproject.com/mantis/view.php?id=361)
Palana 10 年之前
父節點
當前提交
124ccb68de

+ 1 - 0
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"

+ 62 - 32
obs/forms/OBSBasicSettings.ui

@@ -574,7 +574,7 @@
                 <property name="labelAlignment">
                  <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
                 </property>
-                <item row="1" column="1">
+                <item row="0" column="1">
                  <layout class="QHBoxLayout" name="horizontalLayout_5">
                   <item>
                    <widget class="QLineEdit" name="simpleOutputPath">
@@ -595,7 +595,7 @@
                   </item>
                  </layout>
                 </item>
-                <item row="1" column="0">
+                <item row="0" column="0">
                  <widget class="QLabel" name="label_18">
                   <property name="minimumSize">
                    <size>
@@ -611,6 +611,16 @@
                   </property>
                  </widget>
                 </item>
+                <item row="1" column="1">
+                 <widget class="QCheckBox" name="simpleNoSpace">
+                  <property name="text">
+                   <string>Basic.Settings.Output.NoSpaceFileName</string>
+                  </property>
+                  <property name="checked">
+                   <bool>true</bool>
+                  </property>
+                 </widget>
+                </item>
                 <item row="3" column="1">
                  <widget class="QComboBox" name="simpleOutRecFormat">
                   <item>
@@ -1098,14 +1108,24 @@
                              </item>
                             </layout>
                            </item>
-                           <item row="1" column="0">
+                           <item row="1" column="1">
+                            <widget class="QCheckBox" name="advOutNoSpace">
+                             <property name="text">
+                              <string>Basic.Settings.Output.NoSpaceFileName</string>
+                             </property>
+                             <property name="checked">
+                              <bool>true</bool>
+                             </property>
+                            </widget>
+                           </item>
+                           <item row="2" column="0">
                             <widget class="QLabel" name="label_43">
                              <property name="text">
                               <string>Basic.Settings.Output.Format</string>
                              </property>
                             </widget>
                            </item>
-                           <item row="1" column="1">
+                           <item row="2" column="1">
                             <widget class="QComboBox" name="advOutRecFormat">
                              <item>
                               <property name="text">
@@ -1139,14 +1159,14 @@
                              </item>
                             </widget>
                            </item>
-                           <item row="2" column="0">
+                           <item row="3" column="0">
                             <widget class="QLabel" name="label_29">
                              <property name="text">
                               <string>Basic.Settings.Output.Adv.AudioTrack</string>
                              </property>
                             </widget>
                            </item>
-                           <item row="2" column="1">
+                           <item row="3" column="1">
                             <widget class="QWidget" name="widget_9" native="true">
                              <property name="sizePolicy">
                               <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
@@ -1198,17 +1218,17 @@
                              </layout>
                             </widget>
                            </item>
-                           <item row="3" column="0">
+                           <item row="4" column="0">
                             <widget class="QLabel" name="advOutRecEncLabel">
                              <property name="text">
                               <string>Basic.Settings.Output.Encoder</string>
                              </property>
                             </widget>
                            </item>
-                           <item row="3" column="1">
+                           <item row="4" column="1">
                             <widget class="QComboBox" name="advOutRecEncoder"/>
                            </item>
-                           <item row="4" column="0">
+                           <item row="5" column="0">
                             <widget class="QCheckBox" name="advOutRecUseRescale">
                              <property name="sizePolicy">
                               <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
@@ -1224,7 +1244,7 @@
                              </property>
                             </widget>
                            </item>
-                           <item row="4" column="1">
+                           <item row="5" column="1">
                             <widget class="QWidget" name="advOutRecRescaleContainer" native="true">
                              <layout class="QHBoxLayout" name="horizontalLayout_4">
                               <property name="leftMargin">
@@ -1369,38 +1389,38 @@
                        </widget>
                       </widget>
                      </item>
-                     <item row="2" column="0">
+                     <item row="3" column="0">
                       <widget class="QLabel" name="label_16">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.Format</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="2" column="1">
+                     <item row="3" column="1">
                       <widget class="QComboBox" name="advOutFFFormat"/>
                      </item>
-                     <item row="3" column="0">
+                     <item row="4" column="0">
                       <widget class="QLabel" name="label_44">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.FormatDesc</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="3" column="1">
+                     <item row="4" column="1">
                       <widget class="QLabel" name="advOutFFFormatDesc">
                        <property name="text">
                         <string/>
                        </property>
                       </widget>
                      </item>
-                     <item row="5" column="0">
+                     <item row="6" column="0">
                       <widget class="QLabel" name="label_40">
                        <property name="text">
                         <string>Basic.Settings.Output.VideoBitrate</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="5" column="1">
+                     <item row="6" column="1">
                       <widget class="QSpinBox" name="advOutFFVBitrate">
                        <property name="minimum">
                         <number>0</number>
@@ -1413,7 +1433,7 @@
                        </property>
                       </widget>
                      </item>
-                     <item row="6" column="0">
+                     <item row="7" column="0">
                       <widget class="QCheckBox" name="advOutFFUseRescale">
                        <property name="sizePolicy">
                         <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
@@ -1429,7 +1449,7 @@
                        </property>
                       </widget>
                      </item>
-                     <item row="6" column="1">
+                     <item row="7" column="1">
                       <widget class="QComboBox" name="advOutFFRescale">
                        <property name="enabled">
                         <bool>false</bool>
@@ -1439,34 +1459,34 @@
                        </property>
                       </widget>
                      </item>
-                     <item row="7" column="0">
+                     <item row="8" column="0">
                       <widget class="QLabel" name="label_37">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.VEncoder</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="7" column="1">
+                     <item row="8" column="1">
                       <widget class="QComboBox" name="advOutFFVEncoder"/>
                      </item>
-                     <item row="9" column="0">
+                     <item row="10" column="0">
                       <widget class="QLabel" name="label_38">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="9" column="1">
+                     <item row="10" column="1">
                       <widget class="QLineEdit" name="advOutFFVCfg"/>
                      </item>
-                     <item row="10" column="0">
+                     <item row="11" column="0">
                       <widget class="QLabel" name="label_41">
                        <property name="text">
                         <string>Basic.Settings.Output.AudioBitrate</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="10" column="1">
+                     <item row="11" column="1">
                       <widget class="QSpinBox" name="advOutFFABitrate">
                        <property name="minimum">
                         <number>32</number>
@@ -1482,14 +1502,14 @@
                        </property>
                       </widget>
                      </item>
-                     <item row="11" column="0">
+                     <item row="12" column="0">
                       <widget class="QLabel" name="label_47">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.AudioTrack</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="11" column="1">
+                     <item row="12" column="1">
                       <widget class="QWidget" name="widget_10" native="true">
                        <property name="sizePolicy">
                         <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
@@ -1544,24 +1564,24 @@
                        </layout>
                       </widget>
                      </item>
-                     <item row="12" column="0">
+                     <item row="13" column="0">
                       <widget class="QLabel" name="label_39">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.AEncoder</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="12" column="1">
+                     <item row="13" column="1">
                       <widget class="QComboBox" name="advOutFFAEncoder"/>
                      </item>
-                     <item row="13" column="0">
+                     <item row="14" column="0">
                       <widget class="QLabel" name="label_46">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="13" column="1">
+                     <item row="14" column="1">
                       <widget class="QLineEdit" name="advOutFFACfg"/>
                      </item>
                      <item row="0" column="0">
@@ -1600,16 +1620,26 @@
                        </item>
                       </widget>
                      </item>
-                     <item row="4" column="0">
+                     <item row="5" column="0">
                       <widget class="QLabel" name="label_1337">
                        <property name="text">
                         <string>Basic.Settings.Output.Adv.FFmpeg.MuxerSettings</string>
                        </property>
                       </widget>
                      </item>
-                     <item row="4" column="1">
+                     <item row="5" column="1">
                       <widget class="QLineEdit" name="advOutFFMCfg"/>
                      </item>
+                     <item row="2" column="1">
+                      <widget class="QCheckBox" name="advOutFFNoSpace">
+                       <property name="text">
+                        <string>Basic.Settings.Output.NoSpaceFileName</string>
+                       </property>
+                       <property name="checked">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
                     </layout>
                    </widget>
                   </widget>

+ 3 - 2
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,

+ 1 - 1
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 {

+ 10 - 2
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,

+ 20 - 0
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";

+ 1 - 0
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);