Skip to content

Commit 09ef164

Browse files
committed
✨ feat: 添加双份输出功能并优化导出线程管理
1 parent 4f95a26 commit 09ef164

File tree

4 files changed

+105
-9
lines changed

4 files changed

+105
-9
lines changed

src/SimpleCutMainFrame.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ def __init__(self, parent=None):
6161
# TODO: 参数初始化
6262
self.ExportBitCtrl.SetValue("6")
6363

64+
# 线程字典
65+
self.working_thread: dict[str, threading.Thread] = {}
66+
6467
def on_add_file_button_click(self, event):
6568
# 文件选择对话框
6669
file_dlg = wx.FileDialog(self, u"选择导入的文件", "", "", "*.mp4", wx.FD_OPEN)
@@ -164,6 +167,7 @@ def on_export_button_click(self, event):
164167
export_path = self.ExportPathCtrl.GetValue()
165168
export_mbps = self.ExportBitCtrl.GetValue()
166169
export_amix = self.AmixCheckBox.IsChecked()
170+
export_double_output = self.DoubleOutputBox.IsChecked()
167171

168172
# 导出码率设置为空则使用 6 mbps
169173
if export_mbps == '':
@@ -182,7 +186,26 @@ def on_export_button_click(self, event):
182186
path = os.path.dirname(self.video_sequence[0].path)
183187
export_name = path + '/' + export_name
184188

185-
threading.Thread(target=self.export_video_file, args=(export_amix, export_mbps, export_name)).start()
189+
paths = [export_name]
190+
191+
if export_double_output:
192+
# 如果导出双倍输出,则添加后缀
193+
paths.append(export_name + '_WITHAMIX')
194+
195+
# 如果没有后缀 添加类型后缀
196+
for it in paths:
197+
if '.' not in export_name:
198+
it += '.mp4'
199+
200+
# 导出
201+
for it in paths:
202+
if '_WITHAMIX' in paths:
203+
t = threading.Thread(target=self.export_video_file, args=(export_amix, export_mbps, it))
204+
else:
205+
t = threading.Thread(target=self.export_video_file, args=(export_amix, export_mbps, export_name))
206+
self.working_thread[it] = t
207+
t.start()
208+
186209
self.ExportBtn.Disable()
187210

188211
return
@@ -242,7 +265,7 @@ def export_video_file(self, export_amix, export_mbps, export_name):
242265
subprocess.run(console_command, shell=False, check=True, creationflags=subprocess.CREATE_NO_WINDOW)
243266

244267
# 完成命令,发送事件
245-
wx.CallAfter(self.on_export_done, ExportMessage(WorkStateEnum.SUCCESS, "导出完成"))
268+
wx.CallAfter(self.on_export_done, ExportMessage(WorkStateEnum.SUCCESS, "导出完成", export_name))
246269
except subprocess.CalledProcessError as e:
247270
# 导出失败,发送事件
248271
wx.CallAfter(self.on_export_done, ExportMessage(WorkStateEnum.FAIL, e))
@@ -350,11 +373,15 @@ def on_export_done(self, msg: ExportMessage):
350373
logging.debug(f"Export Done: {msg}")
351374
if msg.state == WorkStateEnum.SUCCESS:
352375
wx.MessageBox("导出成功", "提示", wx.OK | wx.ICON_INFORMATION)
376+
if msg.export_name != '':
377+
self.working_thread.pop(msg.export_name)
353378
elif msg.state == WorkStateEnum.FAIL:
354379
logging.error(f"Export Error: {msg.message}")
355380
wx.MessageBox("导出失败", "提示", wx.OK | wx.ICON_INFORMATION)
356381

357-
self.ExportBtn.Enable()
382+
if len(self.working_thread) == 0:
383+
self.ExportBtn.Enable()
384+
358385
return
359386

360387

src/SimpleCutPy.fbp

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
<object class="notebookpage" expanded="true">
125125
<property name="bitmap"></property>
126126
<property name="label">素材设置</property>
127-
<property name="select">1</property>
127+
<property name="select">0</property>
128128
<object class="wxPanel" expanded="true">
129129
<property name="BottomDockable">1</property>
130130
<property name="LeftDockable">1</property>
@@ -928,7 +928,7 @@
928928
<object class="notebookpage" expanded="true">
929929
<property name="bitmap"></property>
930930
<property name="label">导出设置</property>
931-
<property name="select">0</property>
931+
<property name="select">1</property>
932932
<object class="wxPanel" expanded="true">
933933
<property name="BottomDockable">1</property>
934934
<property name="LeftDockable">1</property>
@@ -1611,6 +1611,71 @@
16111611
<property name="window_style"></property>
16121612
</object>
16131613
</object>
1614+
<object class="sizeritem" expanded="true">
1615+
<property name="border">5</property>
1616+
<property name="flag">wxALL</property>
1617+
<property name="proportion">0</property>
1618+
<object class="wxCheckBox" expanded="true">
1619+
<property name="BottomDockable">1</property>
1620+
<property name="LeftDockable">1</property>
1621+
<property name="RightDockable">1</property>
1622+
<property name="TopDockable">1</property>
1623+
<property name="aui_layer"></property>
1624+
<property name="aui_name"></property>
1625+
<property name="aui_position"></property>
1626+
<property name="aui_row"></property>
1627+
<property name="best_size"></property>
1628+
<property name="bg"></property>
1629+
<property name="caption"></property>
1630+
<property name="caption_visible">1</property>
1631+
<property name="center_pane">0</property>
1632+
<property name="checked">0</property>
1633+
<property name="close_button">1</property>
1634+
<property name="context_help"></property>
1635+
<property name="context_menu">1</property>
1636+
<property name="default_pane">0</property>
1637+
<property name="dock">Dock</property>
1638+
<property name="dock_fixed">0</property>
1639+
<property name="docking">Left</property>
1640+
<property name="drag_accept_files">0</property>
1641+
<property name="enabled">1</property>
1642+
<property name="fg"></property>
1643+
<property name="floatable">1</property>
1644+
<property name="font"></property>
1645+
<property name="gripper">0</property>
1646+
<property name="hidden">0</property>
1647+
<property name="id">wxID_ANY</property>
1648+
<property name="label">双份输出</property>
1649+
<property name="max_size"></property>
1650+
<property name="maximize_button">0</property>
1651+
<property name="maximum_size"></property>
1652+
<property name="min_size"></property>
1653+
<property name="minimize_button">0</property>
1654+
<property name="minimum_size"></property>
1655+
<property name="moveable">1</property>
1656+
<property name="name">DoubleOutputBox</property>
1657+
<property name="pane_border">1</property>
1658+
<property name="pane_position"></property>
1659+
<property name="pane_size"></property>
1660+
<property name="permission">protected</property>
1661+
<property name="pin_button">1</property>
1662+
<property name="pos"></property>
1663+
<property name="resize">Resizable</property>
1664+
<property name="show">1</property>
1665+
<property name="size"></property>
1666+
<property name="style"></property>
1667+
<property name="subclass">; ; forward_declare</property>
1668+
<property name="toolbar_pane">0</property>
1669+
<property name="tooltip"></property>
1670+
<property name="validator_data_type"></property>
1671+
<property name="validator_style">wxFILTER_NONE</property>
1672+
<property name="validator_type">wxDefaultValidator</property>
1673+
<property name="validator_variable"></property>
1674+
<property name="window_extra_style"></property>
1675+
<property name="window_name"></property>
1676+
<property name="window_style"></property>
1677+
</object>
1678+
</object>
16141679
</object>
16151680
</object>
16161681
</object>

src/SimpleCutPy.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __init__( self, parent ):
8888
self.m_panel2.SetSizer( bSizer4 )
8989
self.m_panel2.Layout()
9090
bSizer4.Fit( self.m_panel2 )
91-
self.m_notebook1.AddPage( self.m_panel2, u"素材设置", True )
91+
self.m_notebook1.AddPage( self.m_panel2, u"素材设置", False )
9292
self.m_panel3 = wx.Panel( self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
9393
bSizer5 = wx.BoxSizer( wx.VERTICAL )
9494

@@ -149,14 +149,17 @@ def __init__( self, parent ):
149149
self.AmixCheckBox.SetValue(True)
150150
bSizer16.Add( self.AmixCheckBox, 0, wx.ALL, 5 )
151151

152+
self.DoubleOutputBox = wx.CheckBox( self.m_panel3, wx.ID_ANY, u"双份输出", wx.DefaultPosition, wx.DefaultSize, 0 )
153+
bSizer16.Add( self.DoubleOutputBox, 0, wx.ALL, 5 )
154+
152155

153156
bSizer5.Add( bSizer16, 1, wx.EXPAND, 5 )
154157

155158

156159
self.m_panel3.SetSizer( bSizer5 )
157160
self.m_panel3.Layout()
158161
bSizer5.Fit( self.m_panel3 )
159-
self.m_notebook1.AddPage( self.m_panel3, u"导出设置", False )
162+
self.m_notebook1.AddPage( self.m_panel3, u"导出设置", True )
160163
self.m_panel41 = wx.Panel( self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
161164
bSizer13 = wx.BoxSizer( wx.VERTICAL )
162165

src/message.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class WorkStateEnum(Enum):
1010

1111

1212
class ExportMessage:
13-
def __init__(self, state: WorkStateEnum, message: any):
13+
def __init__(self, state: WorkStateEnum, message: any, export_name = ''):
1414
self.state = state
15-
self.message = message
15+
self.message = message
16+
self.export_name = export_name

0 commit comments

Comments
 (0)