ADD 增加视频帧位计算、字符串判空节点
PERF 重构项目结构
This commit is contained in:
124
nodes/videocut.py
Normal file
124
nodes/videocut.py
Normal file
@@ -0,0 +1,124 @@
|
||||
import glob
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import traceback
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
import ffmpy
|
||||
|
||||
|
||||
class VideoCut:
|
||||
"""FFMPEG视频剪辑 -- !有卡顿问题 暂废弃"""
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
return {
|
||||
"required": {
|
||||
"config": ("STRING",),
|
||||
"video_path": ("STRING",),
|
||||
"mod": ("INT",),
|
||||
"fps": ("FLOAT",),
|
||||
"period_length": (
|
||||
"INT",
|
||||
{
|
||||
"default": 10,
|
||||
"min": 4,
|
||||
"max": 100,
|
||||
"step": 1,
|
||||
"forceInput": True,
|
||||
},
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("STRING",)
|
||||
RETURN_NAMES = ("视频路径",)
|
||||
|
||||
FUNCTION = "cut"
|
||||
|
||||
# OUTPUT_NODE = False
|
||||
|
||||
CATEGORY = "不忘科技-自定义节点🚩"
|
||||
|
||||
def cut(self, config, video_path, mod, fps, period_length):
|
||||
# 原文件名
|
||||
origin_fname = ".".join(video_path.split(os.sep)[-1].split(".")[:-1])
|
||||
# 配置获取
|
||||
mul = mod / fps
|
||||
print("fps", fps)
|
||||
config = json.loads(config)
|
||||
if len(config.keys()) == 0:
|
||||
return ("无法生成符合要求的片段",)
|
||||
start, end = config["start"], config["end"]
|
||||
# 新文件名 复制改名适配ffmpeg
|
||||
uid = uuid.uuid1()
|
||||
temp_fname = os.sep.join(
|
||||
[
|
||||
*video_path.split(os.sep)[:-1],
|
||||
"%s.%s" % (str(uid), video_path.split(".")[-1]),
|
||||
]
|
||||
)
|
||||
try:
|
||||
shutil.copy(video_path, temp_fname)
|
||||
except:
|
||||
return ("请检查输入文件权限",)
|
||||
video_path = temp_fname
|
||||
# 组装输出文件名
|
||||
output_name = ".".join(
|
||||
[
|
||||
*video_path.split(os.sep)[-1].split(".")[:-2],
|
||||
video_path.split(os.sep)[-1].split(".")[-2]
|
||||
+ "_output_%%03d_%s" % datetime.now().strftime("%Y%m%d_%H%M%S"),
|
||||
video_path.split(os.sep)[-1].split(".")[-1],
|
||||
]
|
||||
)
|
||||
output = (
|
||||
os.sep.join([*video_path.split(os.sep)[:-1], output_name])
|
||||
.replace(
|
||||
os.sep.join(["ComfyUI", "input"]), os.sep.join(["ComfyUI", "output"])
|
||||
)
|
||||
.replace(" ", "")
|
||||
)
|
||||
# 调用ffmpeg
|
||||
ff = ffmpy.FFmpeg(
|
||||
inputs={video_path: ["-accurate_seek"]},
|
||||
outputs={
|
||||
output: [
|
||||
"-f",
|
||||
"segment",
|
||||
"-ss",
|
||||
str(round(start * mul, 3)),
|
||||
"-to",
|
||||
str(round(end * mul, 3)),
|
||||
"-segment_times",
|
||||
str(period_length),
|
||||
"-c",
|
||||
"copy",
|
||||
"-map",
|
||||
"0",
|
||||
"-avoid_negative_ts",
|
||||
"1",
|
||||
]
|
||||
},
|
||||
)
|
||||
print(ff.cmd)
|
||||
ff.run()
|
||||
# uuid填充改回原文件名
|
||||
try:
|
||||
os.remove(temp_fname)
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
files = glob.glob(output.replace("%03d", "*"))
|
||||
for file in files:
|
||||
shutil.move(file, file.replace(str(uid), origin_fname))
|
||||
files = glob.glob(
|
||||
output.replace(str(uid), origin_fname).replace("%03d", "*")
|
||||
)
|
||||
return (str(files),)
|
||||
except:
|
||||
files = glob.glob(output.replace("%03d", "*"))
|
||||
traceback.print_exc()
|
||||
return (str(files),)
|
||||
Reference in New Issue
Block a user