Added Encoder Settings, FIXME: Add bitrate options.
This commit is contained in:
parent
231af74ea2
commit
e6beca94a3
8
core.py
8
core.py
|
@ -11,6 +11,7 @@ from shutil import rmtree
|
||||||
import atexit
|
import atexit
|
||||||
import time
|
import time
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
class Core():
|
class Core():
|
||||||
|
@ -22,6 +23,13 @@ class Core():
|
||||||
if not os.path.exists(self.tempDir):
|
if not os.path.exists(self.tempDir):
|
||||||
os.makedirs(self.tempDir)
|
os.makedirs(self.tempDir)
|
||||||
atexit.register(self.deleteTempDir)
|
atexit.register(self.deleteTempDir)
|
||||||
|
self.wd = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
self.loadEncoderOptions()
|
||||||
|
|
||||||
|
def loadEncoderOptions(self):
|
||||||
|
file_path = os.path.join(self.wd, 'encoder-options.json')
|
||||||
|
with open(file_path) as json_file:
|
||||||
|
self.encoder_options = json.load(json_file)
|
||||||
|
|
||||||
def findFfmpeg(self):
|
def findFfmpeg(self):
|
||||||
if sys.platform == "win32":
|
if sys.platform == "win32":
|
||||||
|
|
|
@ -6,32 +6,14 @@
|
||||||
"default-vcodec": "H264",
|
"default-vcodec": "H264",
|
||||||
"default-acodec": "AAC",
|
"default-acodec": "AAC",
|
||||||
"video-codecs": [
|
"video-codecs": [
|
||||||
{
|
"H264",
|
||||||
"name": "H264",
|
"H264 (nvenc)",
|
||||||
"encoders": ["libx264"]
|
"MPEG4"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "H264 (nvenc)",
|
|
||||||
"encoders": ["nvenc_264"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MPEG4",
|
|
||||||
"encoders": ["mpeg4"]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"audio-codecs": [
|
"audio-codecs": [
|
||||||
{
|
"AAC",
|
||||||
"name": "AAC",
|
"AC3",
|
||||||
"encoders": ["libfdk_aac","aac"]
|
"MP3"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "AC3",
|
|
||||||
"encoders": ["ac3"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MP3",
|
|
||||||
"encoders": ["libmp3lame"]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -40,40 +22,37 @@
|
||||||
"default-vcodec": "H264",
|
"default-vcodec": "H264",
|
||||||
"default-acodec": "AAC",
|
"default-acodec": "AAC",
|
||||||
"video-codecs": [
|
"video-codecs": [
|
||||||
{
|
"H264",
|
||||||
"name": "H264",
|
"H264 (nvenc)",
|
||||||
"encoders": ["libx264"]
|
"MPEG4",
|
||||||
},
|
"XVID"
|
||||||
{
|
|
||||||
"name": "H264 (nvenc)",
|
|
||||||
"encoders": ["nvenc_264"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MPEG4",
|
|
||||||
"encoders": ["mpeg4"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "XVID",
|
|
||||||
"encoders": ["libxvid"]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"audio-codecs": [
|
"audio-codecs": [
|
||||||
{
|
"AAC",
|
||||||
"name": "AAC",
|
"AC3",
|
||||||
"encoders": ["libfdk_aac","aac"]
|
"MP3",
|
||||||
},
|
"PCM s16 LE"
|
||||||
{
|
]
|
||||||
"name": "AC3",
|
},
|
||||||
"encoders": ["ac3"]
|
{
|
||||||
},
|
"name": "MKV",
|
||||||
{
|
"container": "matroska",
|
||||||
"name": "MP3",
|
"default-vcodec": "H264",
|
||||||
"encoders": ["libmp3lame"]
|
"default-acodec": "AAC",
|
||||||
},
|
"video-codecs": [
|
||||||
{
|
"H264",
|
||||||
"name": "PCM s16 LE",
|
"H264 (nvenc)",
|
||||||
"encoders": ["pcm_s16le"]
|
"MPEG4",
|
||||||
}
|
"MPEG2",
|
||||||
|
"DV",
|
||||||
|
"WMV"
|
||||||
|
],
|
||||||
|
"audio-codecs": [
|
||||||
|
"AAC",
|
||||||
|
"AC3",
|
||||||
|
"MP3",
|
||||||
|
"PCM s16 LE",
|
||||||
|
"WMA"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -82,52 +61,19 @@
|
||||||
"default-vcodec": "H264",
|
"default-vcodec": "H264",
|
||||||
"default-acodec": "AAC",
|
"default-acodec": "AAC",
|
||||||
"video-codecs": [
|
"video-codecs": [
|
||||||
{
|
"H264",
|
||||||
"name": "H264",
|
"H264 (nvenc)",
|
||||||
"encoders": ["libx264"]
|
"MPEG4",
|
||||||
},
|
"MPEG2",
|
||||||
{
|
"DV",
|
||||||
"name": "H264 (nvenc)",
|
"WMV"
|
||||||
"encoders": ["nvenc_264"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MPEG4",
|
|
||||||
"encoders": ["mpeg4"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MPEG2",
|
|
||||||
"encoders": ["mp2video"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "DV",
|
|
||||||
"encoders": ["dvvideo"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "WMV",
|
|
||||||
"encoders": ["wmv2"]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"audio-codecs": [
|
"audio-codecs": [
|
||||||
{
|
"AAC",
|
||||||
"name": "AAC",
|
"AC3",
|
||||||
"encoders": ["libfdk_aac","aac"]
|
"MP3",
|
||||||
},
|
"PCM s16 LE",
|
||||||
{
|
"WMA"
|
||||||
"name": "AC3",
|
|
||||||
"encoders": ["ac3"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "WMA",
|
|
||||||
"encoders": ["wmav2"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MP3",
|
|
||||||
"encoders": ["libmp3lame"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "PCM s16 LE",
|
|
||||||
"encoders": ["pcm_s16le"]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -136,20 +82,11 @@
|
||||||
"default-vcodec": "VP9",
|
"default-vcodec": "VP9",
|
||||||
"default-acodec": "Vorbis",
|
"default-acodec": "Vorbis",
|
||||||
"video-codecs": [
|
"video-codecs": [
|
||||||
{
|
"VP9",
|
||||||
"name": "VP9",
|
"VP8"
|
||||||
"encoders": ["libvpx-vp9"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "VP8",
|
|
||||||
"encoders": ["libvpx"]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"audio-codecs": [
|
"audio-codecs": [
|
||||||
{
|
"Vorbis"
|
||||||
"name": "Vorbis",
|
|
||||||
"encoders": ["vorbis"]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -158,34 +95,36 @@
|
||||||
"default-vcodec": "FLV",
|
"default-vcodec": "FLV",
|
||||||
"default-acodec": "Vorbis",
|
"default-acodec": "Vorbis",
|
||||||
"video-codecs": [
|
"video-codecs": [
|
||||||
{
|
"Sorenson (flv)",
|
||||||
"name": "Sorenson (flv)",
|
"H264",
|
||||||
"encoders": ["flv"]
|
"H264 (nvenc)",
|
||||||
},
|
"MPEG4"
|
||||||
{
|
|
||||||
"name": "H264",
|
|
||||||
"encoders": ["libx264"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "MPEG4",
|
|
||||||
"encoders": ["mpeg4"]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"audio-codecs": [
|
"audio-codecs": [
|
||||||
{
|
"MP3",
|
||||||
"name": "MP3",
|
"PCM s16 LE",
|
||||||
"encoders": ["libmp3lame"]
|
"Vorbis"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Vorbis",
|
|
||||||
"encoders": ["vorbis"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "PCM s16 LE",
|
|
||||||
"encoders": ["pcm_s16le"]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"video-codecs":{
|
||||||
|
"H264": ["libx264"],
|
||||||
|
"H264 (nvenc)": ["nvenc_264"],
|
||||||
|
"MPEG4": ["mpeg4"],
|
||||||
|
"VP9": ["libvpx-vp9"],
|
||||||
|
"VP8": ["libvpx"],
|
||||||
|
"XVID": ["libxvid"],
|
||||||
|
"Sorenson (flv)": ["flv"],
|
||||||
|
"MPEG2": ["mp2video"],
|
||||||
|
"DV": ["dvvideo"],
|
||||||
|
"WMV": ["wmv2"]
|
||||||
|
},
|
||||||
|
"audio-codecs": {
|
||||||
|
"AAC": ["libfdk_aac","aac"],
|
||||||
|
"AC3": ["ac3"],
|
||||||
|
"MP3": ["libmp3lame"],
|
||||||
|
"PCM s16 LE": ["pcm_s16le"],
|
||||||
|
"WMA": ["wmav2"],
|
||||||
|
"Vorbis": ["libvorbis"]
|
||||||
|
}
|
||||||
}
|
}
|
5
main.py
5
main.py
|
@ -25,12 +25,13 @@ def LoadDefaultSettings(self):
|
||||||
"outputWidth": 1280,
|
"outputWidth": 1280,
|
||||||
"outputHeight": 720,
|
"outputHeight": 720,
|
||||||
"outputFrameRate": 30,
|
"outputFrameRate": 30,
|
||||||
"outputAudioCodec": "aac",
|
"outputAudioCodec": "AAC",
|
||||||
"outputAudioBitrate": "192k",
|
"outputAudioBitrate": "192k",
|
||||||
"outputVideoCodec": "libx264",
|
"outputVideoCodec": "H264",
|
||||||
"outputVideoFormat": "yuv420p",
|
"outputVideoFormat": "yuv420p",
|
||||||
"outputPreset": "medium",
|
"outputPreset": "medium",
|
||||||
"outputFormat": "mp4",
|
"outputFormat": "mp4",
|
||||||
|
"outputContainer": "MP4",
|
||||||
"projectDir": os.path.join(self.dataDir, 'projects'),
|
"projectDir": os.path.join(self.dataDir, 'projects'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,37 @@ class MainWindow(QtCore.QObject):
|
||||||
window.pushButton_Cancel.clicked.connect(self.stopVideo)
|
window.pushButton_Cancel.clicked.connect(self.stopVideo)
|
||||||
window.setWindowTitle("Audio Visualizer")
|
window.setWindowTitle("Audio Visualizer")
|
||||||
|
|
||||||
|
for i, container in enumerate(self.core.encoder_options['containers']):
|
||||||
|
window.comboBox_videoContainer.addItem(container['name'])
|
||||||
|
if container['name'] == self.settings.value('outputContainer'):
|
||||||
|
selectedContainer = i
|
||||||
|
|
||||||
|
window.comboBox_videoContainer.setCurrentIndex(selectedContainer)
|
||||||
|
window.comboBox_videoContainer.currentIndexChanged.connect(
|
||||||
|
self.updateCodecs
|
||||||
|
)
|
||||||
|
|
||||||
|
self.updateCodecs()
|
||||||
|
|
||||||
|
for i in range(window.comboBox_videoCodec.count()):
|
||||||
|
codec = window.comboBox_videoCodec.itemText(i)
|
||||||
|
if codec == self.settings.value('outputVideoCodec'):
|
||||||
|
window.comboBox_videoCodec.setCurrentIndex(i)
|
||||||
|
print(codec)
|
||||||
|
|
||||||
|
for i in range(window.comboBox_audioCodec.count()):
|
||||||
|
codec = window.comboBox_audioCodec.itemText(i)
|
||||||
|
if codec == self.settings.value('outputAudioCodec'):
|
||||||
|
window.comboBox_audioCodec.setCurrentIndex(i)
|
||||||
|
|
||||||
|
window.comboBox_videoCodec.currentIndexChanged.connect(
|
||||||
|
self.updateCodecSettings
|
||||||
|
)
|
||||||
|
|
||||||
|
window.comboBox_audioCodec.currentIndexChanged.connect(
|
||||||
|
self.updateCodecSettings
|
||||||
|
)
|
||||||
|
|
||||||
self.previewWindow = PreviewWindow(self, os.path.join(
|
self.previewWindow = PreviewWindow(self, os.path.join(
|
||||||
os.path.dirname(os.path.realpath(__file__)), "background.png"))
|
os.path.dirname(os.path.realpath(__file__)), "background.png"))
|
||||||
window.verticalLayout_previewWrapper.addWidget(self.previewWindow)
|
window.verticalLayout_previewWrapper.addWidget(self.previewWindow)
|
||||||
|
@ -123,11 +154,11 @@ class MainWindow(QtCore.QObject):
|
||||||
str(self.settings.value('outputHeight'))
|
str(self.settings.value('outputHeight'))
|
||||||
for i, res in enumerate(self.resolutions):
|
for i, res in enumerate(self.resolutions):
|
||||||
window.comboBox_resolution.addItem(res)
|
window.comboBox_resolution.addItem(res)
|
||||||
if res == currentRes:
|
if res == currentRes:
|
||||||
currentRes = i
|
currentRes = i
|
||||||
window.comboBox_resolution.setCurrentIndex(currentRes)
|
window.comboBox_resolution.setCurrentIndex(currentRes)
|
||||||
window.comboBox_resolution.currentIndexChanged.connect(
|
window.comboBox_resolution.currentIndexChanged.connect(
|
||||||
self.updateResolution)
|
self.updateResolution)
|
||||||
|
|
||||||
self.window.pushButton_listMoveUp.clicked.connect(
|
self.window.pushButton_listMoveUp.clicked.connect(
|
||||||
self.moveComponentUp)
|
self.moveComponentUp)
|
||||||
|
@ -171,6 +202,34 @@ class MainWindow(QtCore.QObject):
|
||||||
self.previewThread.wait()
|
self.previewThread.wait()
|
||||||
self.autosave()
|
self.autosave()
|
||||||
|
|
||||||
|
def updateCodecs(self):
|
||||||
|
containerWidget = self.window.comboBox_videoContainer
|
||||||
|
vCodecWidget = self.window.comboBox_videoCodec
|
||||||
|
aCodecWidget = self.window.comboBox_audioCodec
|
||||||
|
index = containerWidget.currentIndex()
|
||||||
|
name = containerWidget.itemText(index)
|
||||||
|
self.settings.setValue('outputContainer', name)
|
||||||
|
|
||||||
|
vCodecWidget.clear()
|
||||||
|
aCodecWidget.clear()
|
||||||
|
|
||||||
|
for container in self.core.encoder_options['containers']:
|
||||||
|
if container['name'] == name:
|
||||||
|
for vCodec in container['video-codecs']:
|
||||||
|
vCodecWidget.addItem(vCodec)
|
||||||
|
for aCodec in container['audio-codecs']:
|
||||||
|
aCodecWidget.addItem(aCodec)
|
||||||
|
|
||||||
|
def updateCodecSettings(self):
|
||||||
|
vCodecWidget = self.window.comboBox_videoCodec
|
||||||
|
aCodecWidget = self.window.comboBox_audioCodec
|
||||||
|
currentVideoCodec = vCodecWidget.currentIndex()
|
||||||
|
currentVideoCodec = vCodecWidget.itemText(currentVideoCodec)
|
||||||
|
currentAudioCodec = aCodecWidget.currentIndex()
|
||||||
|
currentAudioCodec = aCodecWidget.itemText(currentAudioCodec)
|
||||||
|
self.settings.setValue('outputVideoCodec', currentVideoCodec)
|
||||||
|
self.settings.setValue('outputAudioCodec', currentAudioCodec)
|
||||||
|
|
||||||
def autosave(self):
|
def autosave(self):
|
||||||
if time.time() - self.lastAutosave >= 1.0:
|
if time.time() - self.lastAutosave >= 1.0:
|
||||||
if os.path.exists(self.autosavePath):
|
if os.path.exists(self.autosavePath):
|
||||||
|
@ -285,7 +344,7 @@ class MainWindow(QtCore.QObject):
|
||||||
self.videoThread.wait()
|
self.videoThread.wait()
|
||||||
|
|
||||||
def updateResolution(self):
|
def updateResolution(self):
|
||||||
resIndex = int(window.comboBox_resolution.currentIndex())
|
resIndex = int(self.window.comboBox_resolution.currentIndex())
|
||||||
res = self.resolutions[resIndex].split('x')
|
res = self.resolutions[resIndex].split('x')
|
||||||
self.settings.setValue('outputWidth', res[0])
|
self.settings.setValue('outputWidth', res[0])
|
||||||
self.settings.setValue('outputHeight', res[1])
|
self.settings.setValue('outputHeight', res[1])
|
||||||
|
|
|
@ -101,10 +101,35 @@ class Worker(QtCore.QObject):
|
||||||
# test if user has libfdk_aac
|
# test if user has libfdk_aac
|
||||||
encoders = sp.check_output(
|
encoders = sp.check_output(
|
||||||
self.core.FFMPEG_BIN + " -encoders -hide_banner", shell=True)
|
self.core.FFMPEG_BIN + " -encoders -hide_banner", shell=True)
|
||||||
|
|
||||||
|
encoders = encoders.decode("utf-8")
|
||||||
|
|
||||||
acodec = self.core.settings.value('outputAudioCodec')
|
acodec = self.core.settings.value('outputAudioCodec')
|
||||||
|
|
||||||
if b'libfdk_aac' in encoders and acodec == 'aac':
|
options = self.core.encoder_options
|
||||||
acodec = 'libfdk_aac'
|
containerName = self.core.settings.value('outputContainer')
|
||||||
|
vcodec = self.core.settings.value('outputVideoCodec')
|
||||||
|
acodec = self.core.settings.value('outputAudioCodec')
|
||||||
|
|
||||||
|
for cont in options['containers']:
|
||||||
|
if cont['name'] == containerName:
|
||||||
|
container = cont['container']
|
||||||
|
|
||||||
|
vencoders = options['video-codecs'][vcodec]
|
||||||
|
aencoders = options['audio-codecs'][acodec]
|
||||||
|
|
||||||
|
print(encoders)
|
||||||
|
for encoder in vencoders:
|
||||||
|
print(encoder)
|
||||||
|
if encoder in encoders:
|
||||||
|
vencoder = encoder
|
||||||
|
break
|
||||||
|
|
||||||
|
for encoder in aencoders:
|
||||||
|
print(encoder)
|
||||||
|
if encoder in encoders:
|
||||||
|
aencoder = encoder
|
||||||
|
break
|
||||||
|
|
||||||
ffmpegCommand = [
|
ffmpegCommand = [
|
||||||
self.core.FFMPEG_BIN,
|
self.core.FFMPEG_BIN,
|
||||||
|
@ -120,12 +145,12 @@ class Worker(QtCore.QObject):
|
||||||
'-i', '-', # The input comes from a pipe
|
'-i', '-', # The input comes from a pipe
|
||||||
'-an',
|
'-an',
|
||||||
'-i', inputFile,
|
'-i', inputFile,
|
||||||
'-acodec', acodec, # output audio codec
|
'-vcodec', vencoder,
|
||||||
|
'-acodec', aencoder, # output audio codec
|
||||||
'-b:a', self.core.settings.value('outputAudioBitrate'),
|
'-b:a', self.core.settings.value('outputAudioBitrate'),
|
||||||
'-vcodec', self.core.settings.value('outputVideoCodec'),
|
|
||||||
'-pix_fmt', self.core.settings.value('outputVideoFormat'),
|
'-pix_fmt', self.core.settings.value('outputVideoFormat'),
|
||||||
'-preset', self.core.settings.value('outputPreset'),
|
'-preset', self.core.settings.value('outputPreset'),
|
||||||
'-f', self.core.settings.value('outputFormat')
|
'-f', container
|
||||||
]
|
]
|
||||||
|
|
||||||
if acodec == 'aac':
|
if acodec == 'aac':
|
||||||
|
|
Reference in New Issue