视频延长
不满足十秒的水平正倒播放延迟十秒以上
import os, math
from moviepy.editor import VideoFileClip, concatenate_videoclips, vfx
# === 配置 ===
INPUT_DIR = r"D:\\1" # 待处理视频目录
OUTPUT_DIR = r"D:\2" # 输出目录
TARGET_SEC = 10 # 最少目标时长(秒)
EXTS = (".mp4", ".mov", ".avi", ".mkv", ".m4v")
os.makedirs(OUTPUT_DIR, exist_ok=True)
def build_pingpong_min_duration(clip, min_sec=10):
"""
把 clip 做成“正放+倒放”交替的 ping-pong 循环,
一直拼到时长 >= min_sec,不截断。
"""
fps = getattr(clip, "fps", None) or 30.0
safe_end = max(clip.duration - (1.0 / fps), 0.0)
forward = clip.subclip(0, safe_end) if safe_end > 0 else clip.subclip(0, clip.duration * 0.999)
reverse = forward.fx(vfx.time_mirror)
pair = concatenate_videoclips([forward, reverse], method="compose")
pair_dur = pair.duration
# 循环次数:至少拼到 >= min_sec
reps = max(1, math.ceil(min_sec / pair_dur)) if pair_dur > 0 else 1
long_clip = concatenate_videoclips([pair] * reps, method="compose")
return long_clip
def process_one(path):
name, ext = os.path.splitext(os.path.basename(path))
out_path = os.path.join(OUTPUT_DIR, f"{name}_pingpong.mp4")
try:
with VideoFileClip(path) as clip:
if clip.duration >= TARGET_SEC:
print(f"[跳过] {path} 时长 {clip.duration:.2f}s (≥ {TARGET_SEC}s)")
return
pingpong = build_pingpong_min_duration(clip, TARGET_SEC)
pingpong.write_videofile(
out_path,
codec="libx264",
audio_codec="aac",
fps=getattr(clip, "fps", None) or 30,
preset="medium",
threads=0
)
print(f"[完成] {out_path}")
except Exception as e:
print(f"[错误] {path}: {e}")
def main():
for fname in os.listdir(INPUT_DIR):
if fname.lower().endswith(EXTS):
process_one(os.path.join(INPUT_DIR, fname))
if __name__ == "__main__":
main()
❤️ 转载文章请注明出处,谢谢!❤️