You've already forked FrameTour-RenderWorker
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from typing import List
|
|
from .base import EffectProcessor
|
|
|
|
class TailEffect(EffectProcessor):
|
|
"""保留末尾效果处理器"""
|
|
|
|
def validate_params(self) -> bool:
|
|
"""验证参数:保留的秒数"""
|
|
if not self.params:
|
|
return True # 默认不截取
|
|
|
|
try:
|
|
tail_seconds = float(self.params)
|
|
return tail_seconds >= 0
|
|
except ValueError:
|
|
return False
|
|
|
|
def generate_filter_args(self, video_input: str, effect_index: int) -> tuple[List[str], str]:
|
|
"""生成保留末尾效果的滤镜参数"""
|
|
if not self.validate_params():
|
|
return [], video_input
|
|
|
|
if not self.params:
|
|
return [], video_input
|
|
|
|
tail_seconds = float(self.params)
|
|
if tail_seconds <= 0:
|
|
return [], video_input
|
|
|
|
output_stream = f"[v_eff{effect_index}]"
|
|
|
|
# 使用reverse+trim+reverse的方法来精确获取最后N秒
|
|
filter_args = [
|
|
f"{video_input}reverse[v_rev{effect_index}]",
|
|
f"[v_rev{effect_index}]trim=duration={tail_seconds}[v_trim{effect_index}]",
|
|
f"[v_trim{effect_index}]reverse{output_stream}"
|
|
]
|
|
|
|
return filter_args, output_stream
|
|
|
|
def get_effect_name(self) -> str:
|
|
return "tail" |