|
|
本帖最后由 cpanel 于 2025-12-14 03:26 编辑
脚本是基于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("全部处理完成!")
复制代码
|
|