【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文档都没有,都没有。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 188. Best Time to Buy and Sell Stock IV

目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 1.求dp[i][j].holding 2.求dp[i][j].sold 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这道题把第123题推广为一…

【笔记】【C++】【基础语法】作用域(scope)、持续时间(duration)和链接(linkage)

【笔记】【C】【基础语法】作用域(scope)、持续时间(duration)和链接(linkage) 最近正在复习学习C(查漏补缺ing)。记录一下学习所得。希望能将所学都整理成一系列的笔记和博客。优先…

Yarn的安装及环境配置

### Yarn 安装教程及环境配置步骤 #### 1. 检查 Node.js 是否已安装 在安装 Yarn 前,需确认系统中已经安装了 Node.js。可以通过以下命令验证其是否存在并获取版本号: bash node -v 如果未安装,则需要先完成 Node.js 的安装。 --- #### 2…

day2-小白学习JAVA---java第一个程序

java第一个程序 1、新建一个文件,以.java为结尾2、用编辑器打开后写入代码(本人写前端,所以用vscode,也可用其他)3、编译文件4、运行文件5、HelloWorld代码解释6、文档注释 1、新建一个文件,以.java为结尾 …

docker部署springboot(eureka server)项目

打jar包 使用maven&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…

解读《人工智能指数报告 2025》:洞察 AI 发展新态势

美国斯坦福大学 “以人为本人工智能研究院”&#xff08;HAI&#xff09;近日发布的第八版《人工智能指数报告》&#xff08;AI Index Report 2025&#xff09;备受全球瞩目。自 2017 年首次发布以来&#xff0c;该报告一直为政策制定者、研究人员、企业高管和公众提供准确、严…

OpenGauss 数据库介绍

OpenGauss 数据库介绍 OpenGauss 是华为基于 PostgreSQL 开发的企业级开源关系型数据库&#xff0c;现已成为开放原子开源基金会的项目。以下是 OpenGauss 的详细介绍&#xff1a; 一 核心特性 1.1 架构设计亮点 特性说明优势多核并行NUMA感知架构充分利用现代CPU多核性能行…

使用Trae CN分析项目架构

架构分析后的截图 A区是打开的项目、B区是源码区、C区是AI给出当前项目的架构分析结果。 如何用 Trae CN 快速学习 STM32 嵌入式项目架构 在嵌入式开发领域&#xff0c;快速理解现有项目的架构是一项关键技能。Trae CN 作为一款强大的分析工具&#xff0c;能帮助开发者高效剖…

MCP协议量子加密实践:基于QKD的下一代安全通信(2025深度解析版)

一、量子计算威胁的范式转移与MCP协议改造必要性 1.1 传统加密体系的崩塌时间表 根据IBM 2025年量子威胁评估报告&#xff0c;当量子计算机达到4000个逻辑量子比特时&#xff08;预计2028年实现&#xff09;&#xff0c;现有非对称加密体系将在72小时内被完全破解。工业物联网…

STM32单片机入门学习——第40节: [11-5] 硬件SPI读写W25Q64

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第一节&#xff1a; [1-1]课程简介第40节: [11-5] 硬件SPI读…

Model Context Protocol (MCP) 开放协议对医疗多模态数据整合的分析路径【附代码】

Model Context Protocol (MCP) 作为一种革命性的开放协议,正在重塑医疗领域多模态数据整合的方式。本文将深入分析MCP协议在医疗多模态数据整合中的具体路径、技术实现、应用场景及未来发展方向,揭示这一协议如何成为连接AI与医疗数据的关键桥梁。 MCP协议概述及其在医疗多模…

刀片服务器的散热构造方式

刀片服务器的散热构造是其高密度、高性能设计的核心挑战之一。其散热系统需在有限空间内高效处理多个刀片模块产生的集中热量,同时兼顾能耗、噪音和可靠性。以下从模块化架构、核心散热技术、典型方案对比、厂商差异及未来趋势等方面展开分析: 一、模块化散热架构 刀片服务器…

java 排序算法-快速排序

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它使用分治法&#xff08;Divide and Conquer&#xff09;策略来把一个序列分为较小和较大的两个子序列&#xff0c;然后递归地排序两个子序列。 快速排序算法的基本思想&#xff1a; 选择基准值&…

Linux工具学习之【vim】

&#x1f4d6;vim 基本用法 要想学会 vim 先要学会进入与退出它 &#x1f4c3;进入 vim 首先要保证自己的 Linux 中已经安装好了 vim &#xff08;云服务器大多数都是出厂就安装好了&#xff09;&#xff0c;如果没有安装&#xff0c;需要在 root 用户下通过指令 yum instal…

win11系统截图的几种方式

在 Windows 11 中&#xff0c;系统内置的截图功能已全面升级&#xff0c;不仅支持多种截图模式&#xff0c;还整合了录屏、OCR 文字识别和 AI 增强编辑等功能。以下是从基础操作到高阶技巧的完整指南&#xff1a; 一、快捷键截图&#xff08;效率首选&#xff09; 1. Win Sh…

写论文时降AIGC和降重的一些注意事项

‘ 写一些研究成果&#xff0c;英文不是很好&#xff0c;用有道翻译过来句子很简单&#xff0c;句型很单一。那么你会考虑用ai吗&#xff1f; 如果语句太正式&#xff0c;高级&#xff0c;会被误判成aigc &#xff0c;慎重选择ai润色。 有的话就算没有用ai生成&#xff0c;但…

Java学习手册:Java并发编程最佳实践

在Java并发编程中&#xff0c;遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践&#xff0c;帮助开发者避免常见陷阱并编写高效的并发程序。 1. 选择合适的并发工具 Java提供了丰富的并发工具&#xff0c;选择合适的工具可以简…

天梯赛DFS合集

1.DFS特殊输入&#xff1a;PTA | 程序设计类实验辅助教学平台 这题其他还是蛮容易&#xff0c;直接用递归即可&#xff0c;问题在于怎么输入&#xff0c;其实可以在递归到底层时输入即可&#xff0c;也就是边递归边输入&#xff0c;另外提一嘴跟这个题没什么关系的点&#xff…

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践 一、应用场景解析 在视频分析类项目中&#xff0c;前端常需要传递几何坐标数据。例如智能安防系统中&#xff0c;需要接收&#xff1a; 视频流地址&#xff08;rtsp_video&#xff09;检测区域坐标点&#xff08;point…

智谱AI大模型免费开放:开启AI创作新时代

文章摘要&#xff1a;近日&#xff0c;国内领先的人工智能公司智谱AI宣布旗下多款大模型服务免费开放&#xff0c;这一举措标志着大模型技术正式迈入普惠阶段。本文将详细介绍智谱AI此次开放的GLM-4 等大模型&#xff0c;涵盖其主要功能、技术特点、使用步骤以及应用场景&#…