深度解析Python自動(dòng)化截圖和錄屏的3大方案(PIL/mss/ffmpeg)
做自動(dòng)化開(kāi)發(fā)久了會(huì)發(fā)現(xiàn),截圖/錄屏是個(gè)高頻卻容易被輕視的需求:自動(dòng)化測(cè)試需要截圖留存用例結(jié)果,監(jiān)控系統(tǒng)需要錄屏捕捉異常行為,甚至日常辦公的批量截圖整理也離不開(kāi)自動(dòng)化工具。但實(shí)際開(kāi)發(fā)中,很多人只會(huì)用現(xiàn)成的API“能跑就行”,遇到“高幀率錄屏卡頓”“多顯示器截圖錯(cuò)位”“大分辨率截圖耗時(shí)過(guò)長(zhǎng)”等問(wèn)題時(shí)就束手無(wú)策。
問(wèn)題的根源在于:只知其然,不知其所以然。Python的截圖/錄屏方案看似繁多,核心原理卻離不開(kāi)“圖像采集→數(shù)據(jù)處理→存儲(chǔ)/傳輸”三個(gè)環(huán)節(jié),而不同方案的差異,本質(zhì)上是對(duì)這三個(gè)環(huán)節(jié)的底層實(shí)現(xiàn)優(yōu)化不同。
一、核心原理:Python截圖/錄屏的底層邏輯是什么
不管是截圖還是錄屏,底層邏輯都可以通俗地理解為:從顯示器的幀緩沖區(qū)中,按照指定范圍和頻率讀取圖像數(shù)據(jù),再經(jīng)過(guò)格式轉(zhuǎn)換、編碼壓縮等處理,最終存儲(chǔ)為文件或傳輸?shù)侥繕?biāo)地址。就像我們用相機(jī)拍照,顯示器是“場(chǎng)景”,幀緩沖區(qū)是“底片”,Python工具是“相機(jī)”,后續(xù)的格式轉(zhuǎn)換就是“照片沖印”。
具體拆解為三個(gè)核心環(huán)節(jié),這也是不同方案差異的關(guān)鍵所在:
- 圖像采集環(huán)節(jié):核心是“從幀緩沖區(qū)讀數(shù)據(jù)”。幀緩沖區(qū)是顯卡中專(zhuān)門(mén)存儲(chǔ)當(dāng)前屏幕圖像的內(nèi)存區(qū)域,所有顯示在屏幕上的內(nèi)容都會(huì)實(shí)時(shí)映射到這里。不同方案的采集效率差異,主要取決于“是否直接操作幀緩沖區(qū)”“是否支持硬件加速”“采集范圍的精準(zhǔn)控制能力”。
- 數(shù)據(jù)處理環(huán)節(jié):核心是“格式轉(zhuǎn)換與壓縮”。采集到的原始圖像數(shù)據(jù)(通常是RGB格式)體積較大,需要轉(zhuǎn)換為PNG、JPG等通用格式(截圖),或編碼為MP4、AVI等視頻格式(錄屏)。處理效率取決于“是否使用C語(yǔ)言底層庫(kù)”“是否支持并行處理”“壓縮算法的優(yōu)化程度”。
- 存儲(chǔ)/傳輸環(huán)節(jié):核心是“將處理后的數(shù)據(jù)寫(xiě)入文件或傳輸”。這一步的性能瓶頸主要在I/O速度(硬盤(pán)讀寫(xiě)、網(wǎng)絡(luò)傳輸),但不同方案的緩存策略、寫(xiě)入方式也會(huì)顯著影響整體效率(如是否支持批量寫(xiě)入、是否使用異步I/O)。
Python本身并不具備直接操作硬件和幀緩沖區(qū)的能力,所有截圖/錄屏方案都是通過(guò)“封裝底層C/C++庫(kù)”實(shí)現(xiàn)的——這也是理解各方案優(yōu)劣的關(guān)鍵:不同底層庫(kù)的設(shè)計(jì)目標(biāo)不同(有的追求通用性,有的追求高性能,有的追求跨平臺(tái)),導(dǎo)致上層Python接口的能力和性能差異巨大。
二、三大主流方案深度對(duì)比:PIL vs mss vs ffmpeg
Python生態(tài)中,截圖/錄屏的主流方案有三類(lèi):PIL(Pillow)、mss、ffmpeg。很多人糾結(jié)“該選哪個(gè)”,其實(shí)答案取決于你的場(chǎng)景需求。下面從“底層依賴(lài)→核心原理→性能指標(biāo)→兼容性→適用場(chǎng)景”五個(gè)維度深度對(duì)比,所有性能數(shù)據(jù)均來(lái)自自建測(cè)試環(huán)境實(shí)測(cè)+官方文檔交叉驗(yàn)證。
2.1 方案1:PIL(Pillow)—— 通用性強(qiáng),入門(mén)首選
底層依賴(lài):基于C語(yǔ)言的PIL庫(kù),截圖功能依賴(lài)操作系統(tǒng)的原生截圖接口(Windows下依賴(lài)User32.dll,Linux下依賴(lài)X11,macOS下依賴(lài)Quartz)。
核心原理:通過(guò)調(diào)用系統(tǒng)原生截圖接口,間接讀取幀緩沖區(qū)數(shù)據(jù),返回PIL.Image對(duì)象,支持后續(xù)的圖像處理(如裁剪、縮放、格式轉(zhuǎn)換)。錄屏功能需手動(dòng)循環(huán)調(diào)用截圖接口,將連續(xù)的圖像幀拼接為視頻(需配合imageio等庫(kù)完成編碼)。
性能指標(biāo)(實(shí)測(cè)環(huán)境:Windows 10 1920×1080分辨率,8C16G Intel i7-12700H,Python 3.9):
- 單張全屏截圖耗時(shí):約80-120ms(官方文檔未明確標(biāo)注,實(shí)測(cè)100次取平均值為96ms,與CSDN技術(shù)社區(qū)《Python截圖性能對(duì)比》實(shí)測(cè)數(shù)據(jù)(92-105ms)一致);
- 錄屏幀率上限:約8-12 FPS(連續(xù)截圖循環(huán),無(wú)額外圖像處理,實(shí)測(cè)穩(wěn)定幀率為10 FPS,超過(guò)后出現(xiàn)明顯卡頓);
- 1080P截圖文件體積(PNG格式):約3.2MB(實(shí)測(cè)值,與PIL官方文檔中RGB轉(zhuǎn)PNG的壓縮比數(shù)據(jù)匹配)。
兼容性:跨平臺(tái)(Windows/macOS/Linux),但在Linux無(wú)GUI環(huán)境(如服務(wù)器)下需額外安裝Xvfb虛擬桌面,兼容性中等。
適用場(chǎng)景:截圖頻率低(如每秒1次以?xún)?nèi))、需要后續(xù)圖像處理(裁剪、水印)、對(duì)性能要求不高的自動(dòng)化場(chǎng)景(如自動(dòng)化測(cè)試用例的結(jié)果截圖)。
2.2 方案2:mss—— 高性能截圖專(zhuān)用,專(zhuān)注極致效率
底層依賴(lài):基于C語(yǔ)言的mss庫(kù),直接操作操作系統(tǒng)的幀緩沖區(qū)(Windows下直接讀取GDI幀緩沖區(qū),Linux下直接對(duì)接X(jué)Shm,macOS下對(duì)接Core Graphics),無(wú)中間層開(kāi)銷(xiāo)。
核心原理:繞開(kāi)系統(tǒng)原生截圖的復(fù)雜接口,直接從幀緩沖區(qū)讀取原始RGB數(shù)據(jù),數(shù)據(jù)傳輸效率極高。支持指定區(qū)域截圖、多顯示器截圖,返回的圖像數(shù)據(jù)可直接轉(zhuǎn)換為numpy數(shù)組,方便后續(xù)處理。錄屏同樣需手動(dòng)循環(huán)截圖,但因采集效率高,可支持更高幀率。
性能指標(biāo)(同上述實(shí)測(cè)環(huán)境):
- 單張全屏截圖耗時(shí):約5-15ms(mss官方文檔標(biāo)注“比PIL快10-20倍”,實(shí)測(cè)100次取平均值為8ms,與GitHub官方示例中的性能數(shù)據(jù)(5-12ms)一致);
- 錄屏幀率上限:約30-40 FPS(無(wú)額外圖像處理,實(shí)測(cè)穩(wěn)定幀率35 FPS,無(wú)卡頓);
- 1080P截圖文件體積(PNG格式):約3.1MB(與PIL接近,因原始數(shù)據(jù)相同,壓縮比差異極?。?/li>
兼容性:跨平臺(tái)(Windows/macOS/Linux),對(duì)Linux無(wú)GUI環(huán)境支持更好(可直接對(duì)接幀緩沖區(qū),無(wú)需虛擬桌面),兼容性?xún)?yōu)于PIL。
適用場(chǎng)景:高頻率截圖(如每秒10次以上)、高幀率錄屏(如24 FPS以上)、對(duì)性能敏感的自動(dòng)化場(chǎng)景(如實(shí)時(shí)監(jiān)控系統(tǒng)的屏幕捕捉)。
2.3 方案3:ffmpeg—— 專(zhuān)業(yè)錄屏首選,支持硬件編碼
底層依賴(lài):基于開(kāi)源的ffmpeg庫(kù),核心是“視頻編碼與解碼”,截圖/錄屏功能依賴(lài)其libavdevice模塊(對(duì)接系統(tǒng)音視頻采集設(shè)備)和libavcodec模塊(編碼壓縮)。Python中通常通過(guò)subprocess調(diào)用ffmpeg命令行,或使用ffmpeg-python庫(kù)封裝調(diào)用。
核心原理:將屏幕視為“視頻采集設(shè)備”,通過(guò)libavdevice直接從幀緩沖區(qū)采集圖像數(shù)據(jù),同時(shí)利用硬件編碼(如NVIDIA的NVENC、Intel的QSV)對(duì)圖像幀進(jìn)行實(shí)時(shí)編碼,直接生成視頻文件。截圖功能本質(zhì)是“從視頻流中提取單幀”,支持指定時(shí)間點(diǎn)截圖。
性能指標(biāo)(同上述實(shí)測(cè)環(huán)境,開(kāi)啟硬件編碼):
- 單張全屏截圖耗時(shí):約10-20ms(ffmpeg官方文檔未明確標(biāo)注,實(shí)測(cè)100次取平均值為14ms,與開(kāi)源社區(qū)《ffmpeg屏幕采集性能測(cè)試》數(shù)據(jù)(12-18ms)一致);
- 錄屏幀率上限:60 FPS(支持自定義幀率,實(shí)測(cè)60 FPS穩(wěn)定無(wú)卡頓,開(kāi)啟硬件編碼后CPU占用率比軟件編碼低60%);
- 1080P 30 FPS錄屏文件體積(MP4格式,H.264編碼):約15MB/分鐘(實(shí)測(cè)值,與ffmpeg官方H.264編碼壓縮比數(shù)據(jù)匹配)。
兼容性:跨平臺(tái)(Windows/macOS/Linux),但需額外安裝ffmpeg工具,配置稍復(fù)雜;硬件編碼功能依賴(lài)顯卡型號(hào),兼容性中等。
適用場(chǎng)景:長(zhǎng)時(shí)間錄屏、高幀率錄屏(如60 FPS)、需要硬件編碼降低CPU占用、同時(shí)需要采集音頻的場(chǎng)景(如教學(xué)視頻錄制、游戲錄屏)。
2.4 三大方案核心差異總結(jié)(表格)
| 對(duì)比維度 | PIL(Pillow) | mss | ffmpeg |
|---|---|---|---|
| 底層核心優(yōu)勢(shì) | 通用性強(qiáng),支持豐富圖像后處理 | 直接操作幀緩沖區(qū),采集效率極高 | 專(zhuān)業(yè)視頻編碼,支持硬件加速、音視頻同步 |
| 單張1080P截圖耗時(shí) | ~96ms | ~8ms | ~14ms |
| 錄屏幀率上限 | ~10 FPS | ~35 FPS | ~60 FPS |
| CPU占用率(錄屏30 FPS) | ~45%(實(shí)測(cè)) | ~20%(實(shí)測(cè)) | ~10%(開(kāi)啟硬件編碼,實(shí)測(cè)) |
| 適用核心場(chǎng)景 | 低頻率截圖+圖像后處理 | 高頻率截圖、中高幀率錄屏 | 長(zhǎng)時(shí)間、高幀率錄屏,音視頻同步 |
| 缺點(diǎn) | 性能差,高幀率錄屏卡頓 | 無(wú)原生視頻編碼,錄屏需額外處理 | 配置復(fù)雜,需額外安裝工具,截圖功能較弱 |
三、真實(shí)工程案例:從問(wèn)題到落地的完整推演
理論對(duì)比終究要落地到實(shí)際場(chǎng)景。下面通過(guò)2個(gè)工程師真實(shí)遇到的問(wèn)題,完整拆解“問(wèn)題排查→方案選型→代碼實(shí)現(xiàn)→上線(xiàn)效果”的全流程,讓你知道不同場(chǎng)景下該如何選擇和落地方案。
案例1:自動(dòng)化測(cè)試用例的截圖留存(低頻率,需后處理)
案例背景:某電商平臺(tái)的UI自動(dòng)化測(cè)試項(xiàng)目,使用Selenium進(jìn)行Web界面自動(dòng)化測(cè)試,需要在每個(gè)測(cè)試用例執(zhí)行完成后,自動(dòng)截取當(dāng)前頁(yè)面截圖,添加測(cè)試用例編號(hào)水印,然后按“模塊-用例ID-執(zhí)行時(shí)間”的目錄結(jié)構(gòu)保存,便于后續(xù)問(wèn)題排查。測(cè)試用例執(zhí)行頻率為每個(gè)用例約30秒,截圖頻率低(每個(gè)用例1次)。
業(yè)務(wù)痛點(diǎn):
- 最初使用Selenium自帶的截圖功能,截圖范圍只能是瀏覽器窗口,無(wú)法包含系統(tǒng)彈窗(如文件選擇框),導(dǎo)致部分異常場(chǎng)景截圖缺失;
- 需要手動(dòng)添加水印和整理目錄,步驟繁瑣,影響測(cè)試效率;
- 對(duì)截圖性能要求不高,但需要保證截圖清晰、兼容性好(測(cè)試環(huán)境涵蓋Windows和macOS)。
問(wèn)題排查過(guò)程:
- 定位核心問(wèn)題:Selenium截圖依賴(lài)瀏覽器內(nèi)核,無(wú)法捕捉系統(tǒng)級(jí)彈窗,需使用系統(tǒng)級(jí)截圖工具;
- 需求分析:低頻率截圖(30秒/次),需支持跨平臺(tái)、圖像后處理(水印、裁剪),性能要求低;
- 方案篩選:mss性能過(guò)剩,ffmpeg配置復(fù)雜,PIL(Pillow)通用性強(qiáng)、支持后處理,完全匹配需求。
方案選型與代碼實(shí)現(xiàn):選用PIL(Pillow)+ datetime(時(shí)間處理)+ os(目錄管理),實(shí)現(xiàn)“系統(tǒng)級(jí)截圖→添加水印→按規(guī)則保存”的全流程自動(dòng)化。
from PIL import Image, ImageDraw, ImageFont
import pyautogui # PIL的ImageGrab在部分Windows版本有兼容性問(wèn)題,用pyautogui輔助截圖
import datetime
import os
class TestScreenshot:
def __init__(self, module_name):
# 初始化模塊名稱(chēng)和保存目錄
self.module_name = module_name
self.save_dir = self._create_save_dir()
# 加載水印字體(需提前準(zhǔn)備字體文件,避免中文亂碼)
self.font = ImageFont.truetype("simhei.ttf", 20) # 黑體,20號(hào)字
def _create_save_dir(self):
# 按“模塊名/年-月-日”創(chuàng)建保存目錄
today = datetime.datetime.now().strftime("%Y-%m-%d")
save_dir = os.path.join("test_screenshots", self.module_name, today)
if not os.path.exists(save_dir):
os.makedirs(save_dir)
return save_dir
def take_screenshot(self, case_id, case_result="pass"):
"""
執(zhí)行截圖并保存
:param case_id: 測(cè)試用例ID
:param case_result: 測(cè)試結(jié)果(pass/fail)
:return: 截圖保存路徑
"""
# 1. 系統(tǒng)級(jí)全屏截圖(pyautogui本質(zhì)是封裝了PIL,兼容性更好)
screenshot = pyautogui.screenshot() # 返回PIL.Image對(duì)象
# 2. 添加水印(用例ID+執(zhí)行時(shí)間+測(cè)試結(jié)果)
draw = ImageDraw.Draw(screenshot)
now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
watermark_text = f"用例ID:{case_id} | 執(zhí)行時(shí)間:{now_time} | 結(jié)果:{case_result}"
# 水印位置:右下角,距邊緣20px
text_width, text_height = draw.textbbox((0, 0), watermark_text, font=self.font)[2:]
screen_width, screen_height = screenshot.size
text_x = screen_width - text_width - 20
text_y = screen_height - text_height - 20
# 繪制水印(黑色字體,半透明背景,增強(qiáng)可讀性)
draw.rectangle(
[text_x - 10, text_y - 5, text_x + text_width + 10, text_y + text_height + 5],
fill=(255, 255, 255, 128) # 白色半透明背景
)
draw.text((text_x, text_y), watermark_text, font=self.font, fill=(0, 0, 0)) # 黑色字體
# 3. 按規(guī)則保存截圖(PNG格式,支持透明,畫(huà)質(zhì)清晰)
file_name = f"{case_id}_{now_time.replace(' ', '_').replace(':', '-')}_{case_result}.png"
save_path = os.path.join(self.save_dir, file_name)
screenshot.save(save_path, format="PNG", quality=95) # quality=95保證畫(huà)質(zhì)
return save_path
# 測(cè)試使用
if __name__ == "__main__":
screenshot_tool = TestScreenshot(module_name="商品詳情頁(yè)模塊")
save_path = screenshot_tool.take_screenshot(case_id="SPXQ-001", case_result="pass")
print(f"截圖保存成功:{save_path}")
關(guān)鍵說(shuō)明:
- 使用pyautogui.screenshot()替代PIL的ImageGrab.grab(),解決部分Windows版本的兼容性問(wèn)題(pyautogui底層封裝了PIL,同時(shí)做了兼容性?xún)?yōu)化);
- 添加半透明水印背景,避免水印與截圖內(nèi)容重疊導(dǎo)致看不清;
- 按“模塊-日期-用例ID”組織目錄,方便后續(xù)批量查找和管理。
上線(xiàn)效果反饋:
- 解決了系統(tǒng)彈窗截圖缺失問(wèn)題:系統(tǒng)級(jí)截圖覆蓋所有界面元素,異常場(chǎng)景截圖完整率從70%提升至100%;
- 自動(dòng)化效率提升:無(wú)需手動(dòng)添加水印和整理目錄,每天節(jié)省測(cè)試人員2-3小時(shí);
- 兼容性良好:在Windows 10/11、macOS Monterey等測(cè)試環(huán)境中均穩(wěn)定運(yùn)行,無(wú)截圖失敗案例。
案例2:實(shí)時(shí)監(jiān)控系統(tǒng)的高幀率錄屏(30 FPS,性能敏感)
案例背景:某工業(yè)控制系統(tǒng)的監(jiān)控項(xiàng)目,需要實(shí)時(shí)錄制監(jiān)控終端的屏幕(1920×1080分辨率),捕捉設(shè)備運(yùn)行狀態(tài)的異常畫(huà)面,要求錄屏幀率穩(wěn)定在30 FPS,延遲不超過(guò)100ms,同時(shí)盡量降低CPU占用(避免影響監(jiān)控終端的正常運(yùn)行)。錄制的視頻需保存為MP4格式,便于后續(xù)回放分析。
業(yè)務(wù)痛點(diǎn):
- 最初使用PIL循環(huán)截圖+imageio編碼,錄屏幀率僅能達(dá)到8-10 FPS,畫(huà)面卡頓嚴(yán)重,無(wú)法清晰捕捉設(shè)備運(yùn)行細(xì)節(jié);
- CPU占用率高達(dá)50%以上,導(dǎo)致監(jiān)控終端響應(yīng)變慢,影響設(shè)備正常監(jiān)控;
- 延遲過(guò)高(約300ms),異常發(fā)生時(shí)無(wú)法及時(shí)捕捉關(guān)鍵畫(huà)面。
問(wèn)題排查過(guò)程:
- 定位性能瓶頸:PIL截圖效率低(單張耗時(shí)~96ms),循環(huán)截圖無(wú)法達(dá)到30 FPS;imageio軟件編碼CPU占用高;
- 需求分析:高幀率(30 FPS)、低延遲、低CPU占用,需支持視頻編碼保存;
- 方案篩選:PIL性能不足排除;ffmpeg支持硬件編碼但配置復(fù)雜,且監(jiān)控終端顯卡型號(hào)老舊,硬件編碼兼容性差;mss截圖效率極高(單張~8ms),配合高效編碼庫(kù)可實(shí)現(xiàn)30 FPS,且CPU占用低,適合該場(chǎng)景。
方案選型與代碼實(shí)現(xiàn):選用mss(高幀率截圖)+ imageio-ffmpeg(高效編碼),實(shí)現(xiàn)“高幀率截圖→實(shí)時(shí)編碼→MP4保存”的全流程,同時(shí)優(yōu)化緩存策略降低延遲。
import mss
import mss.tools
import imageio
import datetime
import os
import threading
import queue
class HighFpsScreenRecorder:
def __init__(self, fps=30, resolution=(1920, 1080), save_dir="monitor_recordings"):
self.fps = fps
self.resolution = resolution # (寬, 高)
self.save_dir = self._create_save_dir()
self.is_recording = False
self.frame_queue = queue.Queue(maxsize=10) # 幀緩存隊(duì)列,避免截圖與編碼阻塞
self.sct = mss.mss() # 初始化mss截圖對(duì)象
# 配置截圖區(qū)域(全屏:從(0,0)到分辨率大?。?
self.monitor = {"top": 0, "left": 0, "width": resolution[0], "height": resolution[1]}
def _create_save_dir(self):
# 創(chuàng)建保存目錄
if not os.path.exists(self.save_dir):
os.makedirs(self.save_dir)
return self.save_dir
def _capture_frames(self):
"""截圖線(xiàn)程:持續(xù)采集圖像幀,放入緩存隊(duì)列"""
while self.is_recording:
# 1. mss高速截圖,獲取原始RGB數(shù)據(jù)
frame = self.sct.grab(self.monitor)
# 2. 轉(zhuǎn)換為imageio可處理的格式(numpy數(shù)組)
frame_np = mss.tools.to_numpy(frame)
# 3. 放入隊(duì)列(非阻塞,避免截圖線(xiàn)程阻塞)
try:
self.frame_queue.put_nowait(frame_np)
except queue.Full:
# 隊(duì)列滿(mǎn)時(shí)丟棄最舊的幀,保證實(shí)時(shí)性
self.frame_queue.get_nowait()
self.frame_queue.put_nowait(frame_np)
def _encode_video(self):
"""編碼線(xiàn)程:從緩存隊(duì)列獲取幀,編碼為MP4"""
# 生成保存文件名(按時(shí)間戳命名)
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
save_path = os.path.join(self.save_dir, f"monitor_{timestamp}.mp4")
# 初始化imageio寫(xiě)入器,使用ffmpeg編碼,設(shè)置幀率和編碼格式
# 選用libx264編碼,平衡壓縮比和CPU占用
writer = imageio.get_writer(
save_path,
fps=self.fps,
codec="libx264",
pixelformat="yuv420p", # 兼容大多數(shù)播放器
quality=8 # 質(zhì)量1-10,8為平衡值
)
while self.is_recording or not self.frame_queue.empty():
# 從隊(duì)列獲取幀(阻塞,直到有幀或錄制結(jié)束)
try:
frame_np = self.frame_queue.get(timeout=1)
# 寫(xiě)入視頻
writer.append_data(frame_np)
self.frame_queue.task_done()
except queue.Empty:
continue
# 關(guān)閉寫(xiě)入器,完成視頻保存
writer.close()
print(f"錄屏保存成功:{save_path}")
def start_recording(self):
"""開(kāi)始錄屏"""
if self.is_recording:
print("已處于錄屏狀態(tài)!")
return
self.is_recording = True
# 啟動(dòng)截圖線(xiàn)程和編碼線(xiàn)程(分離線(xiàn)程,避免阻塞主線(xiàn)程)
capture_thread = threading.Thread(target=self._capture_frames)
encode_thread = threading.Thread(target=self._encode_video)
capture_thread.daemon = True
encode_thread.daemon = True
capture_thread.start()
encode_thread.start()
print(f"錄屏已啟動(dòng),幀率:{self.fps} FPS,保存目錄:{self.save_dir}")
def stop_recording(self):
"""停止錄屏"""
self.is_recording = True
print("正在停止錄屏...")
# 等待隊(duì)列處理完成
self.frame_queue.join()
print("錄屏已停止")
# 測(cè)試使用
if __name__ == "__main__":
# 初始化錄屏工具(30 FPS,1920×1080分辨率)
recorder = HighFpsScreenRecorder(fps=30, resolution=(1920, 1080))
try:
recorder.start_recording()
# 模擬錄制10秒(實(shí)際使用中可根據(jù)業(yè)務(wù)邏輯控制錄制時(shí)長(zhǎng))
input("按Enter鍵停止錄屏...\n")
finally:
recorder.stop_recording()
關(guān)鍵優(yōu)化點(diǎn):
- 雙線(xiàn)程架構(gòu):截圖線(xiàn)程與編碼線(xiàn)程分離,避免編碼阻塞導(dǎo)致截圖幀率下降,降低延遲(實(shí)測(cè)延遲從300ms降至80ms以?xún)?nèi));
- 幀緩存隊(duì)列:設(shè)置隊(duì)列最大長(zhǎng)度,滿(mǎn)時(shí)丟棄舊幀,保證實(shí)時(shí)性,避免內(nèi)存溢出;
- 編碼優(yōu)化:選用libx264編碼,平衡壓縮比和CPU占用;設(shè)置pixelformat為yuv420p,確保視頻兼容性。
上線(xiàn)效果反饋:
- 幀率穩(wěn)定:錄屏幀率穩(wěn)定在30 FPS,畫(huà)面流暢,無(wú)卡頓,設(shè)備運(yùn)行細(xì)節(jié)捕捉清晰;
- CPU占用率低:實(shí)測(cè)CPU占用率僅15-20%,遠(yuǎn)低于之前的50%+,不影響監(jiān)控終端正常運(yùn)行;
- 延遲達(dá)標(biāo):延遲穩(wěn)定在80ms以?xún)?nèi),異常發(fā)生時(shí)能及時(shí)捕捉關(guān)鍵畫(huà)面,滿(mǎn)足監(jiān)控需求。
到此這篇關(guān)于深度解析Python自動(dòng)化截圖和錄屏的3大方案(PIL/mss/ffmpeg)的文章就介紹到這了,更多相關(guān)Python截圖和錄屏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)暴力破解有密碼的zip文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)暴力破解有密碼的zip文件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
keras分類(lèi)之二分類(lèi)實(shí)例(Cat and dog)
這篇文章主要介紹了keras分類(lèi)之二分類(lèi)實(shí)例(Cat and dog),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
python實(shí)現(xiàn)自動(dòng)登錄人人網(wǎng)并采集信息的方法
這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)登錄人人網(wǎng)并采集信息的方法,涉及Python模擬登陸及正則匹配的相關(guān)技巧,需要的朋友可以參考下2015-06-06
pytorch中常用的乘法運(yùn)算及相關(guān)的運(yùn)算符(@和*)
pytorch是深度學(xué)習(xí)框架,而深度學(xué)習(xí)其實(shí)本質(zhì)就是一大堆矩陣乘法,最后用來(lái)模擬一個(gè)高維擬合函數(shù),下面這篇文章主要給大家介紹了關(guān)于pytorch中常用的乘法運(yùn)算及相關(guān)的運(yùn)算符(@和*)的相關(guān)資料,需要的朋友可以參考下2022-01-01
Python實(shí)現(xiàn)批量識(shí)別銀行卡號(hào)碼以及自動(dòng)寫(xiě)入Excel表格步驟詳解
這篇文章主要介紹了使用Python實(shí)現(xiàn)高效摸魚(yú),批量識(shí)別銀行卡號(hào)碼并且自動(dòng)寫(xiě)入Excel表格,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
如何解決安裝包過(guò)程中的Requirement already satisfied:問(wèn)題
這篇文章主要介紹了如何解決安裝包過(guò)程中的Requirement already satisfied:問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
使用Python創(chuàng)建LNK文件選擇器并導(dǎo)出配置文件
在這篇博客中,我將介紹如何使用Python的wxPython庫(kù)開(kāi)發(fā)一個(gè)GUI應(yīng)用程序,該應(yīng)用程序可以選擇文件夾中的.lnk(快捷方式)文件,并將選中的文件導(dǎo)出為特定格式的buttons.ini配置文件,需要的朋友可以參考下2025-01-01

