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

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

相关文章:

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

背景: 终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。 已完成部分: 关于python调用大模型的,可以参考之前的…...

MARA/MARC表 PSTAT字段

最近要开发一个维护物料视图的功能。其中PSTAT字段是来记录已经维护的视图的。这里记录一下视图和其对应的字母。 MARA还有个VPSTA(完整状态)字段,不过在我试的时候每次PSTAT出现一个它就增加一个,不知道具体是为什么。 最近一直…...

《探秘鸿蒙分布式软总线:开启无感发现与零等待传输新时代》

在数字化浪潮中,设备之间的互联互通成为构建智能生态的关键。鸿蒙系统中的分布式软总线技术,宛如一座桥梁,让各种智能设备紧密相连。尤其是其实现的设备间无感发现和零等待传输功能,更是为用户带来了前所未有的便捷体验&#xff0…...

学习型组织与系统思考

真正的学习型组织不是只关注个人的学习,而是关注整个系统的学习。—彼得圣吉 在这两年里,越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师,进而在公司内部进行教学。我非常理解企业这样做的动机,毕竟内部讲师…...

支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成调试

在mingw14.2版本中, print库的功能默认没有开启, 生成可执行文件的tasks.json里要显式加-lstdcexp, 注意放置顺序. tasks.json (支持mingw g14.2 c23的print ) {"version": "2.0.0","tasks": [{"type": "cppbuild","…...

守护者进程小练习

守护者进程含义 定义:守护进程(Daemon)是运行在后台的特殊进程,独立于控制终端,周期性执行任务或等待事件触发。它通常以 root 权限运行,名称常以 d 结尾(如 sshd, crond)。 特性&a…...

opencv函数展示3

一、图像平滑(模糊) 线性滤波(速度快): 1.cv2.blur() 2.cv2.boxFilter() 3.cv2.GaussianBlur() 非线性滤波(速度慢但效果好): 4.cv2.medianBlur() 5.cv2.bilateralFilter() 二、锐…...

环境搭建与入门:Flutter SDK安装与配置

环境搭建与入门:Flutter SDK安装与配置 一、Flutter开发环境概述 1.1 Flutter开发环境组成 Flutter开发环境主要包含以下几个关键组件: Flutter SDK:Flutter的核心开发工具包Dart SDK:Flutter使用的编程语言环境IDE/编辑器&am…...

linux驱动之poll

驱动中 poll 实现 在用户空间实现事件操作的一个主要实现是调用 select/poll/epoll 函数。那么在驱动中怎么来实现 poll 的底层呢? 其实在内核的 struct file_operations 结构体中有一个 poll 成员,其就是底层实现的接口函数。 驱动中 poll 函数实现原…...

遥感技术赋能电力设施监控:应用案例篇

目前主流的电力巡检手段利用无人机能够通过设定灵活航线进行低空飞行、搭载不同的采集设备,能够从不同角度对输电线进行贴近拍摄,但缺陷是偏远山区无人机飞行技术要求高,成本高,且飞行的无人机也可能会对输电线产生破坏。 星图云开…...

SpringAI+DeepSeek大模型应用开发——5 ChatPDF

ChatPDF 知识库 RAG检索增强 由于训练大模型非常耗时,再加上训练语料本身比较滞后,所以大模型存在知识限制问题: 知识数据比较落后,往往是几个月之前的;不包含太过专业领域或者企业私有的数据; 为了解决…...

yolov8 框架自带模型体验功能

简介 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务。 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进&#xff0c…...

柴油机气缸体顶底面粗铣组合机床总体及夹具设计

一、引言 柴油机气缸体是柴油机的关键部件,其顶底面的加工精度直接影响气缸体的装配质量和柴油机的性能。粗铣是气缸体顶底面加工的重要工序,设计一款高效、精确的粗铣组合机床及配套夹具,对于提高气缸体加工效率和质量具有重要意义。 二、…...

SpringBoot - Minio

1、简介 MinIO 是一个开源的对象存储服务器,用于存储和管理大规模的非结构化数据,例如图像、视频、日志文件、备份和容器镜像。MinIO 旨在提供高性能、高可用性、可扩展性和易用性的对象存储解决方案,适用于私有云、公共云和混合云环境。2、…...

Android --- SystemUI启动流程

1.main 函数入口,调用SystemServer().run()方法 代码路径:frameworks/base/services/java/com/android/server/SystemServer.java 2.run 方法中有3种服务的启动,我们主要看StartOtherService 代码路径:frameworks/base/services/java/com/android/se…...

docker镜像被覆盖了怎么办?通过sha256重新上传镜像

如果一个镜像通过相同的标签被重新推送(覆盖),那么旧的镜像内容虽然在 Docker 的存储中可能仍然存在,但通过原来的标签将无法直接访问到它。Docker 和 Harbor 默认情况下不会自动删除旧的镜像层,除非进行了垃圾回收&am…...

(二十六)Java观察者模式在Android开发中的应用详解

Java观察者模式在Android开发中的应用 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象。当主题对象的状态发生变化时,所有注册的观察者…...

【SpringMVC】深入解析自定义拦截器、注册配置拦截器、拦截路径方法及常见拦截路径、排除拦截路径、拦截器的执行流程

拦截器 上个章节我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现方法是比较麻烦的: 需要修改每个接口的处理逻辑需要修改每个接口的返回结果接口定义修改, 前端代码也需要跟着修改 有没有更简单的办法, 统一拦截所有的请求, 并进行Se…...

基于VS Code 为核心平台的python语言智能体开发平台搭建

以下是基于 VS Code 为核心平台,整合 Node-RED、Gradio、Docker Desktop 的智能体可视化开发平台优化方案,聚焦工具链深度集成与开发效率提升: 一、核心架构设计 #mermaid-svg-f8l9kYPAlJ2TlpGF {font-family:"trebuchet ms",verd…...

使用最新threejs复刻经典贪吃蛇游戏的3D版,附完整源码

基类Entity 建立基类Entity,实现投影能力、动画入场效果(从小变大的弹性动画)、计算自己在地图格位置的方法。 // 导入gsap动画库(用于创建补间动画) import gsap from gsap// 定义Entity基类 export default class …...

论坛测试报告

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…...

IPMI 与 Redfish API简介

--- ### **IPMI 与 Redfish API 详解** #### **1. IPMI(智能平台管理接口)** **简介** IPMI(Intelligent Platform Management Interface)是一种硬件级别的带外管理标准,允许管理员通过独立于操作系统的网络通道(BMC)监控和管理服务器硬件,即使主机已关机或操作系…...

zset.

zset 有序集合 zset 保留了 set 不能有重复元素的特点 zset 中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,使得 zset 内部的元素是可以维护有序性的。但是这个有序不是用下标作为排序依据的,而是根据分数&#xf…...

Windows 部署 DeepSeek 详细教程

一、准备工作 系统要求: 建议Windows 10 22H2 或更高版本,家庭版或专业版上网环境: 建议科学上网,国内访问部分网站会很慢设备要求: 内存8G以上、关闭防火墙 二、安装Ollama 官网链接: https://ollama.com/downloadg…...

过去十年前端框架演变与技术驱动因素剖析

一、技术演进脉络(2013-2023) 2013-2015:结构化需求催生框架雏形 早期的jQuery虽然解决了跨浏览器兼容性问题(如IE8兼容性处理),但其松散的代码组织方式难以支撑复杂应用开发。Backbone.js的出现首次引入M…...

从零开始学A2A一:A2A 协议的高级应用与优化

A2A 协议的高级应用与优化 学习目标 掌握 A2A 高级功能 理解多用户支持机制掌握长期任务管理方法学习服务性能优化技巧 理解与 MCP 的差异 分析多智能体场景下的优势掌握不同场景的选择策略 第一部分:多用户支持机制 1. 用户隔离架构 #mermaid-svg-Awx5UVYtqOF…...

#Linux动态大小裁剪以及包大小变大排查思路

1 动态库裁剪 库分为动态库和静态库,动态库是在程序运行时才加载,静态库是在编译时就加载到程序中。动态库的大小通常比静态库小,因为动态库只包含了程序需要的函数和数据,而静态库则包含了所有的函数和数据。静态库可以理解为引入…...

基于微信小程序的中医小妙招系统的设计与实现

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式数据库。 所谓嵌入式,就是足够简单,可以嵌入到我们自己开发的应用程序之中。 在Linux系统中,sqlite的使用只需要使用它的API,连接它的动态连接库,甚至都不用连接,sqlite的实现…...

css button 点击效果

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>button点击效果</title><style>#container {display: flex;align-items: center;justify-content: center;}.pushable {position: relat…...