【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.pswp.cn/diannao/79502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79502.shtml
英文地址,請注明出處:http://en.pswp.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;涵蓋其主要功能、技術特點、使用步驟以及應用場景&#…