reworked ffmpegg support

This commit is contained in:
q
2025-08-19 14:46:41 +03:00
parent 73cf3a3d76
commit 2a08b187c6
2 changed files with 50 additions and 37 deletions

View File

@@ -11,12 +11,6 @@ import cv2
import numpy as np
from scipy.interpolate import PchipInterpolator
AUDIO_COMPRESS = "-c:a libmp3lame -ar 44100 -b:a 192k".split(" ")
AUDIO_COPY = "-c:a copy".split(" ")
AUDIO_DISCARD = "-an".split(" ")
VIDEO_COMPRESS = "-c:v mpeg2video -q:v 3 -g 1".split(" ")
VIDEO_COPY = "-c:v copy".split(" ")
EXT_COMPRESS = ".mpeg"
PLUGIN_FOLDER = os.path.expanduser("~/.config/tsmark/plugins")
COLOR_PREPOST = (0, 128, 128)
@@ -988,19 +982,14 @@ class World:
cropstr = ["-vf", f"crop={w}:{h}:{x}:{y}"]
self.stamps.sort()
print("# Timestamps:")
audio_str = AUDIO_COPY if self.opts.ffmpeg_copy else AUDIO_COMPRESS
video_str = VIDEO_COPY if self.opts.ffmpeg_copy else VIDEO_COMPRESS
audio_str = AUDIO_DISCARD if self.opts.ffmpeg_an else audio_str
for i, ts in enumerate(self.stamps):
print("# {}: {} / {}".format(i + 1, self.format_time(ts), ts))
if len(self.stamps) == 0:
self.stamps.append(0)
self.stamps.append(self.frames)
padlen = len(str(self.frames))
src_name = self.opts.video.replace('"', '\\"')
tgt_name = os.path.splitext(self.opts.video)[0].replace('"', '\\"')
tgt_ext = os.path.splitext(self.opts.video)[1] if self.opts.ffmpeg_copy else EXT_COMPRESS
src_name_print = self.opts.video.replace('"', '\\"')
tgt_name_print = os.path.splitext(self.opts.video)[0].replace('"', '\\"')
for i in range(1, len(self.stamps), 2):
from_ts = self.stamps[i - 1]
@@ -1009,25 +998,34 @@ class World:
to_ft = self.format_time(to_ts)
from_str = str(from_ts).zfill(padlen)
to_str = str(to_ts).zfill(padlen)
ffmpeg_cmd = [
"ffmpeg",
"-hide_banner",
"-i",
shlex.quote(src_name),
*cropstr,
*video_str,
*audio_str,
"-ss",
f"{from_ft}",
"-to",
f"{to_ft}",
shlex.quote(f"{tgt_name}.trim.{from_str}-{to_str}{tgt_ext}"),
]
print(" ".join(ffmpeg_cmd))
ffmpeg_args_print = []
ffmpeg_args = []
for arg in shlex.split(self.opts.ffmpeg_args):
if arg == "{crop}":
ffmpeg_args_print.extend(cropstr)
ffmpeg_args.extend(cropstr)
else:
ffmpeg_args_print.append(
arg.format(
input=shlex.quote(src_name_print),
output=shlex.quote(f"{tgt_name_print}.trim.{from_str}-{to_str}"),
start_time=from_ft,
end_time=to_ft,
)
)
ffmpeg_args.append(
arg.format(
input=self.opts.video,
output=f"{os.path.splitext(self.opts.video)[0]}.trim.{from_str}-{to_str}",
start_time=from_ft,
end_time=to_ft,
)
)
print(" ".join(["ffmpeg", "-hide_banner", *ffmpeg_args_print]))
if self.opts.ffmpeg_run:
ffmpeg_cmd[3] = src_name
ffmpeg_cmd[-1] = f"{tgt_name}.trim.{from_str}-{to_str}{tgt_ext}"
subprocess.run(ffmpeg_cmd)
subprocess.run(["ffmpeg", "-hide_banner", *ffmpeg_args])
def save_timestamps(self):