diff options
| -rw-r--r-- | encoder-options.json | 191 | ||||
| -rw-r--r-- | main.py | 56 | ||||
| -rw-r--r-- | mainwindow.ui | 350 | ||||
| -rw-r--r-- | preview_thread.py | 2 | ||||
| -rw-r--r-- | video_thread.py | 2 |
5 files changed, 440 insertions, 161 deletions
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 @@ -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()) @@ -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) @@ -356,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) diff --git a/mainwindow.ui b/mainwindow.ui index 5e10028..f9e8f5e 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -325,11 +325,11 @@ <property name="currentIndex"> <number>0</number> </property> - <widget class="QWidget" name="tab"> + <widget class="QWidget" name="tab_exportVideo"> <attribute name="title"> - <string>Input Settings</string> + <string>Export Video</string> </attribute> - <layout class="QVBoxLayout" name="verticalLayout_7"> + <layout class="QVBoxLayout" name="verticalLayout_10"> <property name="margin"> <number>10</number> </property> @@ -348,10 +348,16 @@ </property> <property name="minimumSize"> <size> - <width>100</width> + <width>85</width> <height>0</height> </size> </property> + <property name="maximumSize"> + <size> + <width>80</width> + <height>16777215</height> + </size> + </property> <property name="baseSize"> <size> <width>80</width> @@ -427,7 +433,7 @@ </property> <property name="minimumSize"> <size> - <width>100</width> + <width>85</width> <height>0</height> </size> </property> @@ -482,9 +488,142 @@ </item> </layout> </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_11"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QLabel" name="label_outputFile"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>85</width> + <height>0</height> + </size> + </property> + <property name="baseSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>Output File</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="lineEdit_outputFile"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>28</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>28</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="toolButton_selectOutputFile"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>28</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>28</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QProgressBar" name="progressBar_createVideo"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="value"> + <number>24</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>10</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="pushButton_createVideo"> + <property name="text"> + <string>Create Video</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pushButton_Cancel"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> </layout> + <zorder></zorder> + <zorder></zorder> + <zorder></zorder> </widget> - <widget class="QWidget" name="tab_2"> + <widget class="QWidget" name="tab_encoderSettings"> <attribute name="title"> <string>Encoder Settings</string> </attribute> @@ -504,17 +643,40 @@ </property> <property name="minimumSize"> <size> - <width>98</width> + <width>85</width> <height>0</height> </size> </property> <property name="text"> - <string>Video Format</string> + <string>Container</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="comboBox_videoContainer"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> </property> </widget> </item> <item> - <widget class="QComboBox" name="comboBox_videoFormat"/> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>5</width> + <height>5</height> + </size> + </property> + </spacer> </item> <item> <widget class="QLabel" name="label_videoPreset"> @@ -525,12 +687,25 @@ </sizepolicy> </property> <property name="text"> - <string>Video Preset</string> + <string>Resolution</string> </property> </widget> </item> <item> - <widget class="QComboBox" name="comboBox_videoPreset"/> + <widget class="QComboBox" name="comboBox_resolution"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </widget> </item> </layout> </item> @@ -546,7 +721,7 @@ </property> <property name="minimumSize"> <size> - <width>98</width> + <width>85</width> <height>0</height> </size> </property> @@ -590,12 +765,12 @@ </sizepolicy> </property> <property name="text"> - <string>Resolution</string> + <string>Video Bitrate</string> </property> </widget> </item> <item> - <widget class="QComboBox" name="comboBox_resolution"/> + <widget class="QSpinBox" name="spinBox_vBitrate"/> </item> </layout> </item> @@ -611,7 +786,7 @@ </property> <property name="minimumSize"> <size> - <width>98</width> + <width>85</width> <height>0</height> </size> </property> @@ -655,158 +830,17 @@ </sizepolicy> </property> <property name="text"> - <string>Bitrate</string> + <string>Audio Bitrate</string> </property> </widget> </item> <item> - <widget class="QComboBox" name="comboBox_bitrate"/> + <widget class="QSpinBox" name="spinBox_aBitrate"/> </item> </layout> </item> </layout> </widget> - <widget class="QWidget" name="tab_5"> - <attribute name="title"> - <string>Export Video</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_10"> - <property name="margin"> - <number>10</number> - </property> - <item> - <layout class="QVBoxLayout" name="verticalLayout_11"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <widget class="QLabel" name="label_outputFile"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="text"> - <string>Output File</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="lineEdit_outputFile"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>28</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>28</height> - </size> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="toolButton_selectOutputFile"> - <property name="minimumSize"> - <size> - <width>0</width> - <height>28</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>28</height> - </size> - </property> - <property name="text"> - <string>...</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QProgressBar" name="progressBar_createVideo"> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="value"> - <number>24</number> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Minimum</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="pushButton_createVideo"> - <property name="text"> - <string>Create video</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="pushButton_Cancel"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Cancel</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - <zorder></zorder> - </widget> </widget> </item> <item> 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: |
