aboutsummaryrefslogtreecommitdiff
path: root/src/components/waveform.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/waveform.py')
-rw-r--r--src/components/waveform.py170
1 files changed, 99 insertions, 71 deletions
diff --git a/src/components/waveform.py b/src/components/waveform.py
index eef6de0..7dc0b99 100644
--- a/src/components/waveform.py
+++ b/src/components/waveform.py
@@ -1,6 +1,6 @@
from PIL import Image
-from PyQt5 import QtGui, QtCore, QtWidgets
-from PyQt5.QtGui import QColor
+from PyQt6 import QtGui, QtCore, QtWidgets
+from PyQt6.QtGui import QColor
import os
import math
import subprocess
@@ -10,44 +10,51 @@ from ..component import Component
from ..toolkit.frame import BlankFrame, scale
from ..toolkit import checkOutput
from ..toolkit.ffmpeg import (
- openPipe, closePipe, getAudioDuration, FfmpegVideo, exampleSound
+ openPipe,
+ closePipe,
+ getAudioDuration,
+ FfmpegVideo,
+ exampleSound,
)
-log = logging.getLogger('AVP.Components.Waveform')
+log = logging.getLogger("AVP.Components.Waveform")
class Component(Component):
- name = 'Waveform'
- version = '1.0.0'
+ name = "Waveform"
+ version = "1.0.0"
def widget(self, *args):
super().widget(*args)
self._image = BlankFrame(self.width, self.height)
- self.page.lineEdit_color.setText('255,255,255')
-
- if hasattr(self.parent, 'lineEdit_audioFile'):
- self.parent.lineEdit_audioFile.textChanged.connect(
- self.update
- )
-
- self.trackWidgets({
- 'color': self.page.lineEdit_color,
- 'mode': self.page.comboBox_mode,
- 'amplitude': self.page.comboBox_amplitude,
- 'x': self.page.spinBox_x,
- 'y': self.page.spinBox_y,
- 'mirror': self.page.checkBox_mirror,
- 'scale': self.page.spinBox_scale,
- 'opacity': self.page.spinBox_opacity,
- 'compress': self.page.checkBox_compress,
- 'mono': self.page.checkBox_mono,
- }, colorWidgets={
- 'color': self.page.pushButton_color,
- }, relativeWidgets=[
- 'x', 'y',
- ])
+ self.page.lineEdit_color.setText("255,255,255")
+
+ if hasattr(self.parent, "lineEdit_audioFile"):
+ self.parent.lineEdit_audioFile.textChanged.connect(self.update)
+
+ self.trackWidgets(
+ {
+ "color": self.page.lineEdit_color,
+ "mode": self.page.comboBox_mode,
+ "amplitude": self.page.comboBox_amplitude,
+ "x": self.page.spinBox_x,
+ "y": self.page.spinBox_y,
+ "mirror": self.page.checkBox_mirror,
+ "scale": self.page.spinBox_scale,
+ "opacity": self.page.spinBox_opacity,
+ "compress": self.page.checkBox_compress,
+ "mono": self.page.checkBox_mono,
+ },
+ colorWidgets={
+ "color": self.page.pushButton_color,
+ },
+ relativeWidgets=[
+ "x",
+ "y",
+ ],
+ )
def previewRender(self):
self.updateChunksize()
@@ -64,10 +71,13 @@ class Component(Component):
self.video = FfmpegVideo(
inputPath=self.audioFile,
filter_=self.makeFfmpegFilter(),
- width=w, height=h,
+ width=w,
+ height=h,
chunkSize=self.chunkSize,
frameRate=int(self.settings.value("outputFrameRate")),
- parent=self.parent, component=self, debug=True,
+ parent=self.parent,
+ component=self,
+ debug=True,
)
def frameRender(self, frameNo):
@@ -94,37 +104,54 @@ class Component(Component):
command = [
self.core.FFMPEG_BIN,
- '-thread_queue_size', '512',
- '-r', str(self.settings.value("outputFrameRate")),
- '-ss', "{0:.3f}".format(startPt),
- '-i',
- self.core.junkStream
- if genericPreview else inputFile,
- '-f', 'image2pipe',
- '-pix_fmt', 'rgba',
+ "-thread_queue_size",
+ "512",
+ "-r",
+ str(self.settings.value("outputFrameRate")),
+ "-ss",
+ "{0:.3f}".format(startPt),
+ "-i",
+ self.core.junkStream if genericPreview else inputFile,
+ "-f",
+ "image2pipe",
+ "-pix_fmt",
+ "rgba",
]
command.extend(self.makeFfmpegFilter(preview=True, startPt=startPt))
- command.extend([
- '-an',
- '-s:v', '%sx%s' % scale(self.scale, self.width, self.height, str),
- '-codec:v', 'rawvideo', '-',
- '-frames:v', '1',
- ])
+ command.extend(
+ [
+ "-an",
+ "-s:v",
+ "%sx%s" % scale(self.scale, self.width, self.height, str),
+ "-codec:v",
+ "rawvideo",
+ "-",
+ "-frames:v",
+ "1",
+ ]
+ )
if self.core.logEnabled:
logFilename = os.path.join(
- self.core.logDir, 'preview_%s.log' % str(self.compPos))
- log.debug('Creating ffmpeg log at %s', logFilename)
- with open(logFilename, 'w') as logf:
- logf.write(" ".join(command) + '\n\n')
- with open(logFilename, 'a') as logf:
+ self.core.logDir, "preview_%s.log" % str(self.compPos)
+ )
+ log.debug("Creating ffmpeg log at %s", logFilename)
+ with open(logFilename, "w") as logf:
+ logf.write(" ".join(command) + "\n\n")
+ with open(logFilename, "a") as logf:
pipe = openPipe(
- command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
- stderr=logf, bufsize=10**8
+ command,
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ stderr=logf,
+ bufsize=10**8,
)
else:
pipe = openPipe(
- command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
- stderr=subprocess.DEVNULL, bufsize=10**8
+ command,
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL,
+ bufsize=10**8,
)
byteFrame = pipe.stdout.read(self.chunkSize)
closePipe(pipe)
@@ -135,35 +162,35 @@ class Component(Component):
def makeFfmpegFilter(self, preview=False, startPt=0):
w, h = scale(self.scale, self.width, self.height, str)
if self.amplitude == 0:
- amplitude = 'lin'
+ amplitude = "lin"
elif self.amplitude == 1:
- amplitude = 'log'
+ amplitude = "log"
elif self.amplitude == 2:
- amplitude = 'sqrt'
+ amplitude = "sqrt"
elif self.amplitude == 3:
- amplitude = 'cbrt'
+ amplitude = "cbrt"
hexcolor = QColor(*self.color).name()
opacity = "{0:.1f}".format(self.opacity / 100)
genericPreview = self.settings.value("pref_genericPreview")
if self.mode < 3:
filter_ = (
- 'showwaves='
+ "showwaves="
f'r={str(self.settings.value("outputFrameRate"))}:'
f's={self.settings.value("outputWidth")}x{self.settings.value("outputHeight")}:'
f'mode={self.page.comboBox_mode.currentText().lower() if self.mode != 3 else "p2p"}:'
- f'colors={hexcolor}@{opacity}:scale={amplitude}'
+ f"colors={hexcolor}@{opacity}:scale={amplitude}"
)
elif self.mode > 2:
filter_ = (
f'showfreqs=s={str(self.settings.value("outputWidth"))}x{str(self.settings.value("outputHeight"))}:'
f'mode={"line" if self.mode == 4 else "bar"}:'
- f'colors={hexcolor}@{opacity}'
+ f"colors={hexcolor}@{opacity}"
f":ascale={amplitude}:fscale={'log' if self.mono else 'lin'}"
)
baselineHeight = int(self.height * (4 / 1080))
return [
- '-filter_complex',
+ "-filter_complex",
f"{exampleSound('wave', extra='') if preview and genericPreview else '[0:a] '}"
f"{'compand=gain=4,' if self.compress else ''}"
f"{'aformat=channel_layouts=mono,' if self.mono and self.mode < 3 else ''}"
@@ -171,12 +198,14 @@ class Component(Component):
f"{', drawbox=x=(iw-w)/2:y=(ih-h)/2:w=iw:h=%s:color=%s@%s' % (baselineHeight, hexcolor, opacity) if self.mode < 2 else ''}"
f"{', hflip' if self.mirror else''}"
" [v1]; "
- '[v1] scale=%s:%s%s [v]' % (
- w, h,
- ', trim=duration=%s' % "{0:.3f}".format(startPt + 3)
- if preview else '',
+ "[v1] scale=%s:%s%s [v]"
+ % (
+ w,
+ h,
+ ", trim=duration=%s" % "{0:.3f}".format(startPt + 3) if preview else "",
),
- '-map', '[v]',
+ "-map",
+ "[v]",
]
def updateChunksize(self):
@@ -186,15 +215,14 @@ class Component(Component):
def finalizeFrame(self, imageData):
try:
image = Image.frombytes(
- 'RGBA',
+ "RGBA",
scale(self.scale, self.width, self.height, int),
- imageData
+ imageData,
)
self._image = image
except ValueError:
image = self._image
- if self.scale != 100 \
- or self.x != 0 or self.y != 0:
+ if self.scale != 100 or self.x != 0 or self.y != 0:
frame = BlankFrame(self.width, self.height)
frame.paste(image, box=(self.x, self.y))
else: