import os
import subprocess
import tempfile
import shutil

# 根目录
input_dir = r"D:\DESKTOP\2025\44\a1\dataset"  # 替换为你的视频根目录
video_exts = {".avi", ".mov", ".mkv", ".flv", ".webm", ".wmv", ".mp4",".m4s"}

def convert_and_replace(filepath):
    ext = os.path.splitext(filepath)[1].lower()
    if ext not in video_exts:
        return

    print(f"处理文件: {filepath}")

    # 创建临时输出文件
    temp_fd, temp_path = tempfile.mkstemp(suffix=".mp4")
    os.close(temp_fd)  # 不使用 open 的文件描述符

    # ffmpeg 转换命令（保留前30秒，360p，输出mp4）
    cmd = [
        "ffmpeg",
        "-y",
        "-i", filepath,
        "-t", "30",
        "-vf", "scale=-2:480",
        "-c:v", "libx264",  # 改为 libx265 可使用 H.265
        "-preset", "slow",
        "-crf", "18",
        "-c:a", "aac",
        "-b:a", "64k",
        temp_path
    ]

    try:
        subprocess.run(cmd, check=True)
        shutil.move(temp_path, filepath)
        print(f"已替换: {filepath}")
    except subprocess.CalledProcessError as e:
        print(f"失败: {filepath}\n{e}")
        if os.path.exists(temp_path):
            os.remove(temp_path)

# 递归遍历处理
for root, _, files in os.walk(input_dir):
    for name in files:
        file_path = os.path.join(root, name)
        convert_and_replace(file_path)