当前位置: 首页 > news >正文

【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)

 背景:

终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。

已完成部分:

 关于python调用大模型的,可以参考之前的文章:

AI入门7:python三种API方式调用本地Ollama+DeepSeek_deepseek大模型下载到本地后,如何在python代码中调用-CSDN博客

AI入门8:通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)-CSDN博客

AutoIT介绍,和如何安装及配置,以及运行了第一个hello程序,然后学习了基本工具的使用和基本语法,对桌面对象的操控,以及python控制autoit的基本理论,见前面文档:

【AI飞】AutoIT入门一:AutoIT来了,准备让AI动起来-CSDN博客

【AI飞】AutoIT入门二:Autolt v3 Window Info,和SciTE Script Editor的使用及鼠标操作-CSDN博客

【AI飞】AutoIT入门三:Autolt基本语法-CSDN博客

【AI飞】AutoIT入门四(重点):Autolt代替你操控计算机就快要实现了~-CSDN博客

【AI飞】AutoIT入门5(GUI-选学):autoit构建GUI,用得上吗-CSDN博客

【AI飞】AutoIT入门六(拐点):python操控autoit-CSDN博客

本文,继续python调用AutoIT之后,我实实在在的做了一个具体应用,过程曲折,特此总结记录。

本节目标

用AutoIT模拟手工操作,只有在没有其他程序可以替代,且需要重复操作执行,才有必要用AutoIT,我现在就有一堆CSF格式视频,需要转换成现在播放器能播放的。

CSF格式是之前大学课堂录制流行的格式,找了很久的批量转换方法,连AI都没有好的解决办法,尝试了半天,下载安装了ScenicEditor,其中带了个“CSF文件格式转换工具”,只能一个一个视频的转,所以才用python控制autoit批量执行操作。

 准备

需要安装autoit,入门第一篇中有,另外需要开发环境:Trae或者vscode,其安装配置可以参考之前的文档

【Ai工具】trae和传统编程环境vs+代码助手的PK,结果大捷_trae cn与通义灵码对比写代码-CSDN博客

还没安装python的朋友,可以参考之前的文档,Trae就是仿照vsCode,操作不能说一模一样,简直没有差别:

【菜鸟飞】用vsCode搭建python运行环境_code运行python环境-CSDN博客

 第一个python操控autoit的程序见:

【AI飞】AutoIT入门六(拐点):python操控autoit-CSDN博客

开始

直接展示一下成功的结果代码,和实现逻辑,再说其中的“坑”在哪里。

实现业务逻辑

转换一个文件的过程是这样:

运行“CSF文件格式转换工具”,初始界面如下:

进行一次转换,需要进行如下设置:

选择“源文件路径”,就是要转换的文件,选择之后,主界面的下拉框才有相关选项,

然后,是按照上图设置配置项,特别是目标屏幕文件,得修改默认值为当前设置,然后,点击“配置”按钮,进行配置屏幕流量和屏幕帧率。

程序逻辑

轮询源文件夹,把每一个文件,按上面的过程,处理一遍。

调试好的程序

代码如下

import os
import autoit
import time# CSF文件格式转换工具路径
csf2wmv_exe_path = r"E:\Program Files (x86)\ScenicEditor\csf2wmv.exe"
# 源文件路径
source_folder = r"E:\教程\"def is_csf2wmv_running():"""检查 csf2wmv 程序是否已经在运行"""return autoit.win_exists("[TITLE:CSF文件转换工具]")def setup_conversion_tool(csf_file_path, target_folder):"""设置转换工具的参数"""# 如果程序未运行,则启动程序if not is_csf2wmv_running():autoit.run(csf2wmv_exe_path)# 等待主窗口出现if not autoit.win_wait("[TITLE:CSF文件转换工具]", 10):print("错误: CSF文件转换工具窗口未在10秒内出现")return False# 点击“...”按钮选择源文件路径autoit.control_click("[TITLE:CSF文件转换工具]", "Button2")  # 点击“...”按钮# 等待文件选择对话框出现if not autoit.win_wait("[CLASS:#32770; TITLE:打开]", 5):print("错误: 文件选择对话框未在5秒内出现")return Falsetime.sleep(1)# 在文件选择对话框中选择文件autoit.control_set_text("[CLASS:#32770; TITLE:打开]", "Edit1", csf_file_path)# 等待文件选择完成time.sleep(1)#autoit.control_focus("[CLASS:#32770; TITLE:打开]", "Button1")  # 确保焦点在“打开”按钮上autoit.control_click("[CLASS:#32770; TITLE:打开]", "Button2")  # 点击“打开”按钮# 等待文件选择完成time.sleep(1)# 设置目标文件夹autoit.control_focus("[TITLE:CSF文件转换工具]", "Edit2")autoit.control_set_text("[TITLE:CSF文件转换工具]", "Edit2", target_folder)time.sleep(2)#autoit.mouse_move(808,202)#time.sleep(1)autoit.mouse_click("left", 908,302, 1, 0)time.sleep(1)autoit.mouse_click("left", 908,337, 1, 0)time.sleep(3)      # 设置其他选项(根据需要调整)# 目标视音频2文件 try:autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox5")  # 选择屏幕流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox5", "不转换音频")time.sleep(3)        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox6")  # 选择音频流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox6", "不转换视频")except Exception as e:"print(csf_file_path)"try:# 目标视音频1文件  autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox2")  # 选择视频流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox2", "不转换视频")    time.sleep(3)   autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox1")  # 选择视频流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox1", "不转换音频")    except Exception as e:"print(csf_file_path) "       # 目标屏幕文件 time.sleep(3)    autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox3")  # 选择视频流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox3", "Screen 01")time.sleep(3)        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox4")  # 选择音频流autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox4", "Audio 01")time.sleep(2)        # 新增:点击“配置”按钮autoit.control_click("[TITLE:CSF文件转换工具]", "Button9")  # 假设“配置”按钮的控制名为"Button3"time.sleep(1)# 在弹出的配置界面中设置参数if autoit.win_wait("[TITLE:屏幕配置]", 5):  # 等待配置界面出现# 设置屏幕属性autoit.control_focus("[TITLE:屏幕配置]", "Edit1")  # 屏幕流率time.sleep(1)autoit.control_set_text("[TITLE:屏幕配置]", "Edit1", "1200")time.sleep(2)autoit.control_focus("[TITLE:屏幕配置]", "Edit3")  # 屏幕帧率time.sleep(1)autoit.control_set_text("[TITLE:屏幕配置]", "Edit3", "25")time.sleep(1)# 点击“OK”按钮保存配置autoit.control_click("[TITLE:屏幕配置]", "Button1")  # 假设“OK”按钮的控制名为"Button1"time.sleep(1)return Truedef start_conversion():"""开始转换"""if not autoit.control_click("[TITLE:CSF文件转换工具]", "Button1"):print("错误: 无法点击'开始转换'按钮")return Falsereturn Truedef main():# 遍历文件夹中的 .csf 文件for filename in os.listdir(source_folder):if filename.endswith(".csf"):csf_file_path = os.path.join(source_folder, filename)target_folder = source_folder  # 假设与源文件在同一目录下if setup_conversion_tool(csf_file_path, target_folder):if start_conversion():print(f"成功启动转换文件: {filename}")# 等待转换完成(这里简单地等待一段时间,实际应根据具体情况进行调整)print(f"正在转换文件: {filename}")time.sleep(20)  # 根据实际情况调整等待时间print(f"成功转换文件: {filename}")else:print(f"失败启动转换文件: {filename}")else:print(f"失败设置转换工具参数: {filename}")# 转换完成后关闭程序(如果需要)if is_csf2wmv_running():#autoit.win_close("[TITLE:CSF文件转换工具]")print("所有文件转换完成,程序已关闭。")print("所有文件转换完成。")if __name__ == "__main__":main()

程序也不长,但是坑太多,AI都整不出来,最后还费了很多时间,连猜带蒙,才搞出来。

来,盘点一下遇到的哪些“坑”

控件定位坑

有图有真相:

一个button,对应了这个选择文件的区域,从AutoIt Window Info里,你根本看不出来,源文件选择的按钮是哪一个,AI给的程序,它写的是“Button1”,执行调试的时候,只是下面那个按钮被点开,我试着改了一下,结果是button2,对应代码:

坑不,工具定位不到区域里的对象,界面控件序号是无序的。。。

 不确定坑

同一个区域,有的控件能单独被工具捕捉定位,有的不能,特别是你需要定位的,它定位不了,这个下拉框的参数要改,结果你不知道它是老几。。。

这个也在上面区域里,它能被定位到: 

 我试了很久,不能相信它对控件还有歧视,扫雷似的,探查半天,没找到规律。。。

控件灵异坑

看下代码,其中,49、51行,是用鼠标点击操作,模拟了第一个选择视频流的下拉菜单操作,代码看着是重复的,但是去掉49、51行,下面的下拉菜单控件,程序就找不到,运行就报错,找不到对象,控件啥时候出现,怎么出现,这个未解之谜,至今没找到原因。

上面这几个坑,AI完全避不开,怎么问都问不出所以然。 

霸占系统坑 

程序执行 一起来,如果你碰了鼠标,或切换它用的窗口,它就找不到对象了,所以程序运行起来,你的电脑就被霸占了,只能看着它点来点去,别的啥也别想干了。。。

有用的经验

sleep的使用

代码里有很多Sleep,AI给的程序中,没加,执行的时候,不是控件找不到,就是数据设置不上,交互界面,不一定比人操作速度快,得等等程序。。。

界面对象探查

让AI写了一个桌面对象探查的程序,代码如下:

import autoit
import timedef get_window_info(title):"""获取指定窗口的信息"""if not autoit.win_exists(title):print(f"窗口 '{title}' 不存在")return None# 获取窗口类名列表class_list = autoit.win_get_class_list(title)class_name = class_list.split("|")[0] if class_list else None  # 取第一个类名window_info = {"title": autoit.win_get_title(title),"text": autoit.win_get_text(title),"class": class_name,"pos": autoit.win_get_pos(title),"handle": autoit.win_get_handle(title)}return window_infodef get_controls_info(title):"""获取指定窗口内所有控件的信息"""controls_info = []# 获取窗口句柄hwnd = autoit.win_get_handle(title)if not hwnd:print(f"无法获取窗口 '{title}' 的句柄")return controls_info# 遍历窗口内的所有控件control_id = 0while True:control = autoit.control_get_handle(title, "[ID:" + str(control_id) + "]")if not control:breakcontrol_info = {"id": control_id,"class": autoit.control_get_classname(title, "[ID:" + str(control_id) + "]"),"text": autoit.control_get_text(title, "[ID:" + str(control_id) + "]"),"pos": autoit.control_get_pos(title, "[ID:" + str(control_id) + "]")}controls_info.append(control_info)control_id += 1return controls_infodef main():# 窗口标题window_title = "CSF文件转换工具"# 获取窗口信息window_info = get_window_info(window_title)if window_info:print("-------窗口信息:----------")for key, value in window_info.items():print(f"  {key}: {value}")print("-------窗口信息:结束----------")# 获取控件信息controls_info = get_controls_info(window_title)if controls_info:print("\n======》控件信息:")for control in controls_info:print("  控件信息:")for key, value in control.items():print(f"    {key}: {value}")if __name__ == "__main__":# 确保 CSF文件转换工具 窗口已经打开print("请确保 'CSF文件转换工具' 窗口已经打开...")time.sleep(2)  # 等待2秒,确保窗口已经打开main()

窗口信息能探索出来,控件信息AI改了多次,探查不出来,窗口信息中,class参数收集了窗口控件的类型和文本信息,具有一定参考性:

我把输出的text和class信息,对应起来,和控件界面对照了一下:

可以参考着,调试代码:

看着有点用。

结尾:

千言万语,就一句话:AI的尽头,还是是人脑,嘿嘿😊😊😊。。。

另一句话,pyautoit的资料真的少,连中文API文档都没有,都没有。。。

相关文章:

  • 如何下载适用于Docker环境的Google Chrome浏览器【镜像使用方法】
  • RT-Thread RTThread studio 初使用
  • osgb和obj格式互转
  • 计算机视觉---相机标定
  • Oracle之数据库对象加连表查询
  • 前端 实现文字打字效果(仿AI)
  • 三维点拟合直线ransac c++
  • C/C++中获取或处理时间节点方法
  • UWP特性分析
  • 软件招标评审模板
  • OpenCV day6
  • 责任链模式:从 Sentinel 流控到审批流程的链式处理
  • 什么是Netty
  • 常见免杀框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】
  • IHC肿瘤标志物 | 常见前列腺癌诊断
  • RAG-分块策略
  • 项目实战--新闻分类
  • 如何从EndNote中将某一篇手稿里面涉及到的引用文献导出,导出格式为bib?
  • 北京SMT贴片厂精密制造关键工艺
  • ESP-IDF教程2 GPIO - 输入、输出和中断
  • 中国墨西哥商会副执行主席:深耕中国市场18年,对未来充满信心
  • 湖南平江发生一起意外翻船事件,6人不幸溺亡
  • 浙江桐乡征集涉企行政执法问题线索,含乱收费、乱罚款、乱检查等
  • 对话地铁读书人|翻译Esther:先读原著,再看电影
  • 龙登高谈近世的基层治理及制度变迁
  • 泽连斯基称乌克兰全境响起防空警报