无忧启动论坛

标题: 用ai写的批量视频快速无损旋转脚本[python] [打印本页]

作者: cpanel    时间: 20 小时前
标题: 用ai写的批量视频快速无损旋转脚本[python]
本帖最后由 cpanel 于 2025-12-14 03:26 编辑

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

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

下面是代码:
  
  1. import os
  2. import subprocess
  3. from tkinter import Tk, filedialog, simpledialog, messagebox

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

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

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

  27. def rotate_video(input_path, output_path, angle, threads):
  28.     """调用 ffmpeg 设置 display_rotation,无损旋转"""
  29.     cmd = [
  30.         'ffmpeg',
  31.         '-threads', str(threads),
  32.         '-display_rotation:0', str(angle),
  33.         '-i', input_path,
  34.         '-c', 'copy',
  35.         output_path
  36.     ]
  37.     try:
  38.         print(f"正在处理: {os.path.basename(input_path)}")
  39.         subprocess.run(cmd, check=True)
  40.         print(f"完成: {output_path}")
  41.     except subprocess.CalledProcessError as e:
  42.         print(f"处理失败: {input_path}")
  43.         print(e)

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

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

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

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

  69.     # 映射为 FFmpeg 所需的角度(绕 Y 轴顺时针 → 逆时针角度)
  70.     angle_map = {
  71.         0: 0,
  72.         90: 270,
  73.         180: 180,
  74.         270: 90
  75.     }
  76.     rotation_angle = angle_map[user_rotation]

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

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





作者: wang1126    时间: 17 小时前
谢谢楼主分享
作者: 小龙飞    时间: 17 小时前
感谢您的分享!
作者: ebaqiang    时间: 16 小时前
很不错,很nice
作者: nie956    时间: 16 小时前
感谢分享
作者: PCHH    时间: 16 小时前
谢谢分享
作者: bj6688    时间: 16 小时前
感谢楼主分享.
作者: win98se    时间: 15 小时前
谢谢分享
作者: bilvnet    时间: 15 小时前
没有Python
作者: smile_z    时间: 15 小时前
学习一下
作者: 好好学些    时间: 14 小时前
谢谢楼主分享
作者: mouse723    时间: 14 小时前
驚為天人的神作,看了讓人熱血沸騰,感謝分享。
作者: yzw92    时间: 14 小时前
谢谢楼主分享
作者: hhcha    时间: 14 小时前
感谢分享!
作者: ylac    时间: 14 小时前
谢谢楼主分享
作者: a66    时间: 14 小时前
支持~
作者: a272121742    时间: 13 小时前
感谢分享!
作者: wn168cn@163.com    时间: 13 小时前
支持原创
作者: liuyang2025    时间: 13 小时前
感谢开源
作者: womwom    时间: 12 小时前
感谢分享!
作者: yzszh64    时间: 12 小时前
感谢楼主了。
作者: 100308223    时间: 12 小时前

感谢分享!
作者: kedion    时间: 12 小时前
速度倒是快,但是有些播放器是不支持的,还是重新编码比较保险
作者: sulong    时间: 12 小时前
谢谢楼主分享
作者: guong    时间: 12 小时前
谢谢分享了
作者: fegr    时间: 10 小时前
感谢分享!
作者: hmaaaa    时间: 10 小时前
感謝大大辛苦分享!感恩!^^
作者: lnjxgx    时间: 9 小时前
感谢分享
作者: 董大    时间: 8 小时前
支持一下原创,谢谢楼主分享!!
作者: 2011yousu    时间: 5 小时前

谢谢楼主分享
作者: handsome_xiang    时间: 5 小时前
感谢楼主分享!
作者: renchmin    时间: 5 小时前
这个用ai写的批量视频快速无损旋转脚本确实很不错的
作者: lnjxgx    时间: 1 小时前
感谢分享




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3