一个轻量级的屏幕录制和回放工具,自动捕捉屏幕变化并提供时间轴浏览功能。
- 🖥️ 多显示器支持 - 自动检测并独立监控所有连接的显示器
- 🎯 智能检测 - 仅在屏幕内容变化时才保存截图,节省存储空间
- 📊 时间轴浏览 - 通过滑块轻松回溯历史屏幕状态
- 🔍 搜索功能 - 按应用名称或窗口标题搜索截图
- 🎨 深色/浅色主题 - 支持主题切换,界面美观
- 💾 自动清理 - 自动删除超过3天的旧数据
- 📱 响应式设计 - 界面适配不同屏幕尺寸
pip install -r requirements.txtpython app.py程序启动后:
- 自动开始监控屏幕变化
- Web界面运行在
http://localhost:8082
# 只监控主显示器
python app.py --primary-monitor-only
# 自定义存储路径
python app.py --storage-path /path/to/storage- 打开
http://localhost:8082 - 使用滑块浏览不同时间点的截图
- 支持键盘快捷键:
←向前(旧)→向后(新)
- 点击截图可全屏查看
- 点击顶部"搜索"标签
- 在搜索框输入应用名或窗口标题
- 按
Enter搜索 - 卡片式展示所有匹配的截图
- 启动时:立即保存所有屏幕的初始截图
- 每10秒:检测所有屏幕的内容变化
- 独立保存:只保存发生变化的屏幕,避免数据冗余
- 相似度检测:使用MSSIM算法,相似度 < 0.9 视为变化
目录结构:
~/Documents/Programming/recall/ # 可在 config.py 修改
├── screenshots/ # 截图文件 (.avif格式,读取兼容历史 .webp)
├── logs/ # 运行日志
└── recall.db # SQLite数据库
数据库表:
entries- 记录每个屏幕的变化事件(时间戳、应用名、窗口标题)monitor_snapshots- 记录每个时间点的显示器数量
- 使用二分查找算法,快速定位每个屏幕在指定时间点的最新截图
- 根据图片实际尺寸动态调整显示比例
- 支持多显示器配置变化(插拔显示器)
- 滑块控制:拖动查看不同时间点
- 多屏显示:并排显示所有显示器,按实际分辨率比例
- 窗口信息:显示截图时的前台应用和窗口标题
- 全屏查看:点击图片进入lightbox模式
- 实时搜索:按应用名或标题过滤
- 网格布局:卡片式展示所有匹配结果
- 屏幕标识:标注截图来自哪个显示器
编辑 config.py:
DATA_ROOT_DIR = os.path.join(os.path.expanduser("~"), "your", "custom", "path")编辑 screenshot.py 中的 time.sleep(10) 改为你想要的秒数。
编辑 screenshot.py 中的 cleanup_old_data(days=3) 改为你想要的天数。
编辑 screenshot.py 中的 similarity < 0.9 改为你需要的阈值(0-1之间)。
- 智能截图:只在有变化时保存,大幅减少存储占用
- AVIF压缩:quality=50、speed=8,压缩率优于 WebP,且读取时自动回退历史 .webp
- 独立监控:每个屏幕独立检测和保存
- 自动清理:定期删除旧数据,避免磁盘占满
后端:
- Python 3.x
- Flask - Web框架
- mss - 跨平台截图
- Pillow - 图像处理
- NumPy - 数值计算(MSSIM)
- SQLite - 数据存储
前端:
- Bootstrap 4 - UI框架
- Vanilla JavaScript - 前端逻辑
- 自定义CSS - 深色/浅色主题
平台支持:
- Windows - pywin32, psutil
- macOS - pyobjc
- Linux - xprop, xprintidle
- 所有数据存储在本地
- 无网络通信(除非手动配置)
- Web界面仅监听本地端口
- 日志文件包含时间戳和基本运行信息
A: 程序会在10秒后开始检测变化。启动时会保存一张初始截图,但需要屏幕内容实际变化后才会保存新截图。
A: 确保没有使用 --primary-monitor-only 参数。检查日志中是否有"Monitor X changed"的提示。
A: 程序已优化为只在有变化时打印日志。可以手动删除旧的日志文件。
A: 直接关闭程序(Ctrl+C)即可。
A: 编辑 screenshot.py 中的 quality=50 改为更高的值(1-100)。
app/
├── app.py # Flask应用入口,Web路由
├── screenshot.py # 截图线程,变化检测
├── database.py # 数据库操作
├── config.py # 配置管理
├── utils.py # 工具函数(窗口检测、时间转换)
└── requirements.txt # Python依赖
MSSIM(平均结构相似性指数):
def mean_structured_similarity_index(img1, img2, L=255):
# 计算两张图片的相似度(0-1之间)
# 值越接近1表示越相似二分查找最新截图:
function findLatestEvent(mi, ts) {
// 找到屏幕mi在时间ts之前的最新一次变化
// O(log n) 时间复杂度
}本项目基于原始 OpenRecall 项目修改,同样以 AGPL-3.0 许可发布。
- 原始项目:OpenRecall
- 使用的开源库:Flask, mss, Pillow, Bootstrap
- ✨ 重构截图逻辑,每个屏幕独立检测和保存
- 🎨 优化前端界面,支持深色/浅色主题
- 📊 改进时间轴渲染,支持多显示器实际比例显示
- 🐛 修复启动时重复截图的问题
- 📝 减少日志输出,只在有变化时打印
- 🗑️ 启动时清理孤立的数据库记录
- 💾 大幅减少存储空间占用(按需保存)