视频延长

不满足十秒的水平正倒播放延迟十秒以上

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()
❤️ 转载文章请注明出处,谢谢!❤️