[原创] 用ai写的批量视频快速无损旋转脚本[python]

脚本是基于ffmpeg的,
需要与ffmpeg.exe同目录

因为有很多视频存在拍摄方向不一样的问题,又一直找不到合适的软件,
所以就找AI开发了这个脚本。
优点,可以批量多线程无损快速旋转视频[平均几秒钟一个视频]。
缺点,只支持部分编码视频,视频格式也只支持mp4mpv等常用格式,
当然格式可以自行往代码中添加,但是有些编码是无法用这种方式旋转的。

import os
import subprocess
from tkinter import Tk, filedialog, simpledialog, messagebox

# 支持的视频扩展名
SUPPORTED_EXTENSIONS = ('.mp4', '.mov', '.m4v', '.mkv')

def select_directory(title):
    """弹出窗口选择目录"""
    root = Tk()
    root.withdraw()
    folder = filedialog.askdirectory(title=title)
    return folder

def get_user_input(prompt, default_value, value_type=str, allowed_values=None):
    """弹出窗口获取用户输入"""
    root = Tk()
    root.withdraw()
    while True:
        try:
            value = simpledialog.askstring("输入参数", prompt + f"(默认:{default_value})")
            if value is None or value.strip() == "":
                return default_value
            typed_value = value_type(value)
            if allowed_values and typed_value not in allowed_values:
                raise ValueError()
            return typed_value
        except ValueError:
            messagebox.showerror("输入错误", f"请输入有效的值(允许: {allowed_values})")

def rotate_video(input_path, output_path, angle, threads):
    """调用 ffmpeg 设置 display_rotation,无损旋转"""
    cmd = [
        'ffmpeg',
        '-threads', str(threads),
        '-display_rotation:0', str(angle),
        '-i', input_path,
        '-c', 'copy',
        output_path
    ]
    try:
        print(f"正在处理: {os.path.basename(input_path)}")
        subprocess.run(cmd, check=True)
        print(f"完成: {output_path}")
    except subprocess.CalledProcessError as e:
        print(f"处理失败: {input_path}")
        print(e)

def process_videos(input_dir, output_dir, angle, threads):
    """处理所有视频文件"""
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(SUPPORTED_EXTENSIONS):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)
            rotate_video(input_path, output_path, angle, threads)

if __name__ == "__main__":
    print("请选择输入目录:")
    input_folder = select_directory("选择包含视频的输入文件夹")
    if not input_folder:
        print("未选择输入目录,程序退出。")
        exit()

    print("请选择输出目录:")
    output_folder = select_directory("选择用于保存视频的输出文件夹")
    if not output_folder:
        print("未选择输出目录,程序退出。")
        exit()

    # 获取用户输入的旋转角度(符合人类直觉:顺时针旋转)
    user_rotation = get_user_input(
        "请输入顺时针旋转角度(可选:0, 90, 180, 270)",
        default_value=90,
        value_type=int,
        allowed_values=[0, 90, 180, 270]
    )

    # 映射为 FFmpeg 所需的角度(绕 Y 轴顺时针 → 逆时针角度)
    angle_map = {
        0: 0,
        90: 270,
        180: 180,
        270: 90
    }
    rotation_angle = angle_map[user_rotation]

    # 获取线程数
    threads = get_user_input(
        "请输入要使用的 CPU 线程数(建议 1-8)",
        default_value=2,
        value_type=int
    )

    print(f"\n开始处理视频...\n输入目录: {input_folder}\n输出目录: {output_folder}\n旋转角度: {user_rotation}°(实际写入 {rotation_angle}°)\n线程数: {threads}\n")
    process_videos(input_folder, output_folder, rotation_angle, threads)
    print("全部处理完成!")

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注