From a3557cbc4f192b520f7fccd849ebf4f70937cfee Mon Sep 17 00:00:00 2001 From: DH4 Date: Sat, 3 Jun 2017 19:10:27 -0500 Subject: UI Updates, encode lockout, added encoder-options.json. FIXME: Add encoder options to the UI. --- encoder-options.json | 191 ++++++++++++++++++++++++++++ main.py | 44 +++++++ mainwindow.ui | 350 ++++++++++++++++++++++++++++----------------------- 3 files changed, 427 insertions(+), 158 deletions(-) create mode 100644 encoder-options.json diff --git a/encoder-options.json b/encoder-options.json new file mode 100644 index 0000000..699ead4 --- /dev/null +++ b/encoder-options.json @@ -0,0 +1,191 @@ +{ + "containers":[ + { + "name": "MP4", + "container": "mp4", + "default-vcodec": "H264", + "default-acodec": "AAC", + "video-codecs": [ + { + "name": "H264", + "encoders": ["libx264"] + }, + { + "name": "H264 (nvenc)", + "encoders": ["nvenc_264"] + }, + { + "name": "MPEG4", + "encoders": ["mpeg4"] + } + ], + "audio-codecs": [ + { + "name": "AAC", + "encoders": ["libfdk_aac","aac"] + }, + { + "name": "AC3", + "encoders": ["ac3"] + }, + { + "name": "MP3", + "encoders": ["libmp3lame"] + } + ] + }, + { + "name": "MOV", + "container": "mov", + "default-vcodec": "H264", + "default-acodec": "AAC", + "video-codecs": [ + { + "name": "H264", + "encoders": ["libx264"] + }, + { + "name": "H264 (nvenc)", + "encoders": ["nvenc_264"] + }, + { + "name": "MPEG4", + "encoders": ["mpeg4"] + }, + { + "name": "XVID", + "encoders": ["libxvid"] + } + ], + "audio-codecs": [ + { + "name": "AAC", + "encoders": ["libfdk_aac","aac"] + }, + { + "name": "AC3", + "encoders": ["ac3"] + }, + { + "name": "MP3", + "encoders": ["libmp3lame"] + }, + { + "name": "PCM s16 LE", + "encoders": ["pcm_s16le"] + } + ] + }, + { + "name": "AVI", + "container": "avi", + "default-vcodec": "H264", + "default-acodec": "AAC", + "video-codecs": [ + { + "name": "H264", + "encoders": ["libx264"] + }, + { + "name": "H264 (nvenc)", + "encoders": ["nvenc_264"] + }, + { + "name": "MPEG4", + "encoders": ["mpeg4"] + }, + { + "name": "MPEG2", + "encoders": ["mp2video"] + }, + { + "name": "DV", + "encoders": ["dvvideo"] + }, + { + "name": "WMV", + "encoders": ["wmv2"] + } + ], + "audio-codecs": [ + { + "name": "AAC", + "encoders": ["libfdk_aac","aac"] + }, + { + "name": "AC3", + "encoders": ["ac3"] + }, + { + "name": "WMA", + "encoders": ["wmav2"] + }, + { + "name": "MP3", + "encoders": ["libmp3lame"] + }, + { + "name": "PCM s16 LE", + "encoders": ["pcm_s16le"] + } + ] + }, + { + "name": "WEBM", + "container": "webm", + "default-vcodec": "VP9", + "default-acodec": "Vorbis", + "video-codecs": [ + { + "name": "VP9", + "encoders": ["libvpx-vp9"] + }, + { + "name": "VP8", + "encoders": ["libvpx"] + } + ], + "audio-codecs": [ + { + "name": "Vorbis", + "encoders": ["vorbis"] + } + ] + }, + { + "name": "FLV", + "container": "flv", + "default-vcodec": "FLV", + "default-acodec": "Vorbis", + "video-codecs": [ + { + "name": "Sorenson (flv)", + "encoders": ["flv"] + }, + { + "name": "H264", + "encoders": ["libx264"] + }, + { + "name": "MPEG4", + "encoders": ["mpeg4"] + } + ], + "audio-codecs": [ + { + "name": "MP3", + "encoders": ["libmp3lame"] + }, + { + "name": "Vorbis", + "encoders": ["vorbis"] + }, + { + "name": "PCM s16 LE", + "encoders": ["pcm_s16le"] + } + ] + } + ] + +} \ No newline at end of file diff --git a/main.py b/main.py index 49fe469..c5080f3 100644 --- a/main.py +++ b/main.py @@ -305,9 +305,53 @@ class Main(QtCore.QObject): if status: self.window.pushButton_createVideo.setEnabled(False) self.window.pushButton_Cancel.setEnabled(True) + self.window.comboBox_resolution.setEnabled(False) + self.window.stackedWidget.setEnabled(False) + self.window.tab_encoderSettings.setEnabled(False) + self.window.label_audioFile.setEnabled(False) + self.window.toolButton_selectAudioFile.setEnabled(False) + self.window.label_outputFile.setEnabled(False) + self.window.toolButton_selectOutputFile.setEnabled(False) + self.window.lineEdit_audioFile.setEnabled(False) + self.window.lineEdit_outputFile.setEnabled(False) + self.window.pushButton_addComponent.setEnabled(False) + self.window.pushButton_removeComponent.setEnabled(False) + self.window.pushButton_listMoveDown.setEnabled(False) + self.window.pushButton_listMoveUp.setEnabled(False) + self.window.comboBox_openPreset.setEnabled(False) + self.window.pushButton_removePreset.setEnabled(False) + self.window.pushButton_savePreset.setEnabled(False) + self.window.pushButton_openProject.setEnabled(False) + self.window.listWidget_componentList.setEnabled(False) + + self.window.label_background.setEnabled(False) + self.window.lineEdit_background.setEnabled(False) + self.window.toolButton_selectBackground.setEnabled(False) else: self.window.pushButton_createVideo.setEnabled(True) self.window.pushButton_Cancel.setEnabled(False) + self.window.comboBox_resolution.setEnabled(True) + self.window.stackedWidget.setEnabled(True) + self.window.tab_encoderSettings.setEnabled(True) + self.window.label_audioFile.setEnabled(True) + self.window.toolButton_selectAudioFile.setEnabled(True) + self.window.lineEdit_audioFile.setEnabled(True) + self.window.label_outputFile.setEnabled(True) + self.window.toolButton_selectOutputFile.setEnabled(True) + self.window.lineEdit_outputFile.setEnabled(True) + self.window.pushButton_addComponent.setEnabled(True) + self.window.pushButton_removeComponent.setEnabled(True) + self.window.pushButton_listMoveDown.setEnabled(True) + self.window.pushButton_listMoveUp.setEnabled(True) + self.window.comboBox_openPreset.setEnabled(True) + self.window.pushButton_removePreset.setEnabled(True) + self.window.pushButton_savePreset.setEnabled(True) + self.window.pushButton_openProject.setEnabled(True) + self.window.listWidget_componentList.setEnabled(True) + + self.window.label_background.setEnabled(True) + self.window.lineEdit_background.setEnabled(True) + self.window.toolButton_selectBackground.setEnabled(True) diff --git a/mainwindow.ui b/mainwindow.ui index 5e10028..f9e8f5e 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -325,11 +325,11 @@ 0 - + - Input Settings + Export Video - + 10 @@ -348,10 +348,16 @@ - 100 + 85 0 + + + 80 + 16777215 + + 80 @@ -427,7 +433,7 @@ - 100 + 85 0 @@ -482,9 +488,142 @@ + + + + + + + + + 0 + 0 + + + + + 85 + 0 + + + + + 0 + 0 + + + + Output File + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 28 + + + + + 16777215 + 28 + + + + + + + + + 0 + 28 + + + + + 16777215 + 28 + + + + ... + + + + + + + + + + + 0 + + + + + + 0 + 0 + + + + 24 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 10 + 20 + + + + + + + + Create Video + + + + + + + false + + + Cancel + + + + + + + + - + Encoder Settings @@ -504,17 +643,40 @@ - 98 + 85 0 - Video Format + Container + + + + + + + + 150 + 0 + - + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 5 + 5 + + + @@ -525,12 +687,25 @@ - Video Preset + Resolution - + + + + 0 + 0 + + + + + 0 + 0 + + + @@ -546,7 +721,7 @@ - 98 + 85 0 @@ -590,12 +765,12 @@ - Resolution + Video Bitrate - + @@ -611,7 +786,7 @@ - 98 + 85 0 @@ -655,158 +830,17 @@ - Bitrate + Audio Bitrate - + - - - Export Video - - - - 10 - - - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 0 - 0 - - - - Output File - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 28 - - - - - 16777215 - 28 - - - - - - - - - 0 - 28 - - - - - 16777215 - 28 - - - - ... - - - - - - - - - - - 0 - - - - - - 0 - 0 - - - - 24 - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 10 - 20 - - - - - - - - Create video - - - - - - - true - - - Cancel - - - - - - - - -- cgit v1.2.3 From e6d119769f825a523bc96c3bfe1c87015be54c9f Mon Sep 17 00:00:00 2001 From: DH4 Date: Sat, 3 Jun 2017 19:29:25 -0500 Subject: Render order reversed to match component list. --- preview_thread.py | 2 +- video_thread.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/preview_thread.py b/preview_thread.py index b20e9a1..63d1ac5 100644 --- a/preview_thread.py +++ b/preview_thread.py @@ -56,7 +56,7 @@ class Worker(QtCore.QObject): frame.paste(im) components = nextPreviewInformation["components"] - for component in components: + for component in reversed(components): newFrame = Image.alpha_composite(frame,component.previewRender(self)) frame = Image.alpha_composite(frame,newFrame) diff --git a/video_thread.py b/video_thread.py index 0d42406..c97cc24 100644 --- a/video_thread.py +++ b/video_thread.py @@ -43,7 +43,7 @@ class Worker(QtCore.QObject): else: frame = self.getBackgroundAtIndex(i[1]) - for compNo, comp in enumerate(self.components): + for compNo, comp in reversed(list(enumerate(self.components))): if compNo in self.staticComponents and self.staticComponents[compNo] != None: frame = Image.alpha_composite(frame, self.staticComponents[compNo]) else: -- cgit v1.2.3 From 5b78a26d8069e48ad5ba88f457b563620be72173 Mon Sep 17 00:00:00 2001 From: DH4 Date: Sat, 3 Jun 2017 19:54:53 -0500 Subject: Add component inserts on top. --- main.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index c5080f3..2aa7fa9 100644 --- a/main.py +++ b/main.py @@ -186,7 +186,7 @@ class Main(QtCore.QObject): self.compMenu = QMenu() for i, comp in enumerate(self.modules): action = self.compMenu.addAction(comp.Component.__doc__) - action.triggered[()].connect( lambda item=i: self.addComponent(item)) + action.triggered[()].connect( lambda item=i: self.insertComponent(item)) self.window.pushButton_addComponent.setMenu(self.compMenu) window.listWidget_componentList.clicked.connect(lambda _: self.changeComponentWidget()) @@ -400,6 +400,16 @@ class Main(QtCore.QObject): self.selectedComponents[-1].update() self.updateOpenPresetComboBox(self.selectedComponents[-1]) + def insertComponent(self, moduleIndex): + self.selectedComponents.insert(0, self.modules[moduleIndex].Component()) + self.window.listWidget_componentList.insertItem(0, self.selectedComponents[0].__doc__) + self.pages.insert(0, self.selectedComponents[0].widget(self)) + self.window.listWidget_componentList.setCurrentRow(0) + self.window.stackedWidget.insertWidget(0, self.pages[0]) + self.window.stackedWidget.setCurrentIndex(0) + self.selectedComponents[0].update() + self.updateOpenPresetComboBox(self.selectedComponents[0]) + def removeComponent(self): for selected in self.window.listWidget_componentList.selectedItems(): index = self.window.listWidget_componentList.row(selected) -- cgit v1.2.3