# OpenFocus **Repository Path**: python_90/open-focus ## Basic Information - **Project Name**: OpenFocus - **Description**: 本系统是一款智能录屏工具,支持点击缩放效果和多种音频录制模式。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-15 - **Last Updated**: 2026-04-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpenFocus [English](https://github.com/Bob8259/OpenFocus) | 简体中文 --- # OpenFocus - 智能录屏系统 ## 概览 OpenFocus 是一款功能强大的智能录屏工具,专为教程制作、演示录制和屏幕分享设计。它采用先进的录制技术和智能后处理算法,能够自动捕捉鼠标点击并应用平滑的缩放效果,让观众的注意力始终跟随操作焦点。 ### 主要特点 - 🎯 **智能点击缩放** - 自动检测鼠标点击并平滑放大点击区域 - 🖱️ **虚拟光标显示** - 在输出视频中显示鼠标轨迹和点击波纹效果 - 🎬 **区域录制支持** - 支持全屏录制或自定义区域录制 - 🎤 **多模式音频录制** - 支持系统声音、麦克风或混合录制 - ⏸️ **暂停/继续功能** - 录制过程中可随时暂停,暂停部分自动剪辑 - 🌍 **多语言支持** - 支持简体中文和英文界面 - ⌨️ **全局快捷键** - 使用快捷键快速控制录制 ### 免责声明 *本项目中的代码主要由 AI 生成。使用前请仔细检查!* --- ## 核心功能 ### 1. 智能点击缩放效果 当您在录制过程中点击鼠标时,OpenFocus 会自动放大点击区域,让观众清晰地看到您的操作。缩放效果具有以下特点: - **平滑过渡**:使用线性插值算法实现自然的缩放动画 - **可调参数**:支持自定义最大缩放倍数、平滑速度和持续时间 - **智能定位**:自动将点击位置置于画面中心 ### 2. 虚拟光标和点击动画 录制完成后,OpenFocus 会在视频中添加: - **虚拟鼠标光标**:绿色箭头光标,始终跟随鼠标移动 - **点击波纹效果**:点击时显示红色扩散圆圈,持续 0.5 秒 - **坐标映射**:即使在缩放状态下,光标位置也能准确对应 ### 3. 灵活的录制区域 - **全屏录制**:默认录制整个屏幕 - **区域选择**:通过鼠标拖拽选择任意矩形区域 - **实时预览**:选择区域时显示半透明遮罩和尺寸信息 ### 4. 四种音频录制模式 | 模式 | 说明 | 适用场景 | |------|------|----------| | **无音频** | 仅录制视频画面 | 纯演示、无需解说的场景 | | **仅系统声音** | 录制电脑播放的所有声音 | 游戏录制、软件演示 | | **仅麦克风** | 录制麦克风输入的声音 | 语音解说、旁白录制 | | **麦克风和系统** | 同时录制并混合两者 | 在线教学、会议录制 | ### 5. 录制控制 - **开始/停止录制**:`Ctrl + F1` - **暂停/继续录制**:`Ctrl + F2` - **状态指示**:屏幕中央显示录制/暂停图标 --- ## 安装 ### 系统要求 - **操作系统**:Windows 10/11(64位) - **推荐配置**:Windows 11,8GB 内存,独立显卡 - **必备组件**:FFmpeg(已包含在 Release 版本中) ### 快速开始 #### 方法一:直接下载(推荐) 1. 访问 [Releases](https://github.com/Bob8259/OpenFocus/releases) 页面 2. 下载最新版本的 `OpenFocus.zip` 3. 解压到任意目录 4. 运行 `OpenFocus.exe` #### 方法二:从源码运行 如果您想自定义代码或参与开发: **1. 创建 Conda 环境** ```bash conda create -n OpenFocus python=3.10 conda activate OpenFocus ``` **2. 克隆仓库** ```bash git clone https://github.com/Bob8259/OpenFocus.git cd OpenFocus ``` **3. 安装 Python 依赖** ```bash pip install -r requirements.txt ``` **4. 安装 FFmpeg** *方式一:手动安装* 1. 访问 [FFmpeg 官方网站](https://ffmpeg.org/download.html) 2. 下载 Windows 版本 3. 解压到项目目录下的 `ffmpeg/` 文件夹 4. 确保 `ffmpeg/bin/ffmpeg.exe` 存在 *方式二:使用 Chocolatey* ```bash choco install ffmpeg ``` **5. 启动程序** ```bash python main.py ``` ### 构建可执行文件(可选) ```bash pip install pyinstaller pyinstaller main.spec ``` 构建完成后,可执行文件位于 `dist/OpenFocus.exe`。 --- ## 使用指南 ### 界面说明 ``` ┌─────────────────────────────────────────────────────────────┐ │ OpenFocus - 智能录屏系统 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [选择录制区域] [恢复全屏] │ │ │ │ 录制参数设置 │ │ ├─ 最大缩放倍数: [====●====] 1.5x │ │ ├─ 平滑速度: [==●======] 0.15 │ │ └─ 缩放持续时间: [====●====] 1.0s │ │ │ │ 音频设置 │ │ ├─ 录制模式: [仅系统声音 ▼] │ │ ├─ 系统音量: [========●==] 80% │ │ └─ 麦克风音量: [======●===] 60% │ │ │ │ 其他设置 │ │ ├─ 语言: [简体中文 ▼] │ │ ├─ 视频质量: [高 ▼] │ │ └─ 保存路径: [C:/Videos ▼] │ │ │ │ [开始录制] [停止录制] │ │ │ │ 状态: 就绪 │ │ 时长: 00:00:00 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 参数说明 #### 录制参数 | 参数 | 范围 | 默认值 | 说明 | |------|------|--------|------| | **最大缩放倍数** | 1.0 - 3.0 | 1.5 | 点击时的最大放大倍数。1.0 表示不缩放,2.0 表示放大到 2 倍 | | **平滑速度** | 0.01 - 1.0 | 0.15 | 缩放动画的平滑程度。值越大,缩放响应越快 | | **缩放持续时间** | 0.1 - 5.0 秒 | 1.0 | 每次缩放效果持续的时长 | #### 音频参数 | 参数 | 范围 | 默认值 | 说明 | |------|------|--------|------| | **系统音量** | 0% - 300% | 100% | 系统声音的录制音量,可放大到 3 倍 | | **麦克风音量** | 0% - 300% | 100% | 麦克风的录制音量,可放大到 3 倍 | #### 视频质量 | 质量 | CRF 值 | 文件大小 | 适用场景 | |------|--------|----------|----------| | **低** | 28 | 较小 | 快速预览、网络传输 | | **中** | 23 | 中等 | 日常使用(推荐) | | **高** | 18 | 较大 | 高质量存档、后期编辑 | ### 录制流程 ``` 1. 选择录制区域 ├─ 点击"选择录制区域"按钮 ├─ 在屏幕上拖拽选择区域 └─ 释放鼠标确认选择 2. 配置录制参数 ├─ 调整缩放倍数、平滑速度、持续时间 ├─ 选择音频录制模式 └─ 设置音量和视频质量 3. 开始录制 ├─ 点击"开始录制"按钮或按 Ctrl+F1 ├─ 屏幕中央显示录制图标 └─ 状态栏显示录制时长 4. 录制过程中 ├─ 正常操作电脑 ├─ 点击鼠标触发缩放效果 ├─ 按 Ctrl+F2 暂停/继续 └─ 按 Ctrl+F1 停止录制 5. 后处理 ├─ 自动应用缩放效果 ├─ 添加虚拟光标和点击动画 ├─ 合并音视频 └─ 生成最终文件 6. 完成 └─ 文件保存在指定目录,格式:Record_时间戳.mp4 ``` ### 快捷键 | 快捷键 | 功能 | 说明 | |--------|------|------| | `Ctrl + F1` | 开始/停止录制 | 全局快捷键,在任何界面都有效 | | `Ctrl + F2` | 暂停/继续录制 | 录制过程中使用,暂停部分会被自动剪辑 | --- ## 技术架构 ### 系统架构 OpenFocus 采用分层架构设计,分为四个主要层次: ``` ┌─────────────────────────────────────────────────────────────┐ │ 用户界面层 (UI Layer) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ 主窗口 │ │ 区域选择器 │ │ 覆盖图标 │ │ │ │ (main.py) │ │ (region) │ │ (overlay) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 核心引擎层 (Core Engine) │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ FFmpeg 录制引擎 ││ │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ ││ │ │ │ 视频录制 │ │ 音频录制 │ │ 鼠标追踪 │ ││ │ │ │ (FFmpeg) │ │(SoundDev)│ │ (pynput) │ ││ │ │ └──────────┘ └──────────┘ └──────────────────────┘ ││ │ └─────────────────────────────────────────────────────────┘│ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 后处理器 (PostProcessor) ││ │ │ - 缩放效果 / 虚拟光标 / 点击波纹 / 暂停剪辑 ││ │ └─────────────────────────────────────────────────────────┘│ ├─────────────────────────────────────────────────────────────┤ │ 工具层 (Utilities) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 路径工具 │ │ 语言管理 │ │ 配置管理 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 外部依赖 (Dependencies) │ │ FFmpeg / OpenCV / SoundDevice / pynput / CustomTkinter │ └─────────────────────────────────────────────────────────────┘ ``` ### 录制流程 ``` 开始录制 │ ├── 启动 FFmpeg 视频录制子进程 │ └── ffmpeg -f gdigrab -framerate 30 -i desktop ... │ ├── 启动音频录制(如果启用) │ └── SoundDevice InputStream │ ├── 启动鼠标监听 │ └── pynput 监听点击和移动 │ └── 记录开始时间戳 停止录制 │ ├── 终止 FFmpeg 进程 ├── 停止音频录制并保存 ├── 停止鼠标监听并保存日志 │ └── 启动后处理 ├── 逐帧处理视频 │ ├── 应用缩放效果 │ ├── 绘制虚拟光标 │ └── 绘制点击波纹 ├── 剪掉暂停区间 ├── 合并音视频 └── 清理临时文件 ``` ### 技术栈 | 组件 | 用途 | 版本要求 | |------|------|----------| | **CustomTkinter** | 现代化 GUI 框架 | >= 5.0 | | **FFmpeg** | 视频编码、屏幕捕获、音视频合并 | >= 4.0 | | **OpenCV** | 视频后处理、图像处理 | >= 4.5 | | **SoundDevice** | 音频录制(系统声音、麦克风) | >= 0.4 | | **pynput** | 全局鼠标和键盘监听 | >= 1.7 | | **PyAutoGUI** | 获取屏幕尺寸和鼠标位置 | >= 0.9 | | **NumPy** | 音频数据处理和图像数组操作 | >= 1.20 | --- ## 项目结构 ``` OpenFocus/ ├── main.py # 主应用程序入口 ├── ffmpeg_record_engine.py # FFmpeg 录制引擎 ├── audio_recorder.py # 音频录制器 ├── region_selector.py # 区域选择器 ├── overlay_icon.py # 覆盖图标 ├── post_processor.py # 后处理器 ├── video_audio_merger.py # 音视频合并器 ├── requirements.txt # Python 依赖 ├── main.spec # PyInstaller 配置 ├── config.json # 用户配置文件(运行时生成) │ ├── utils/ # 工具模块 │ ├── __init__.py │ ├── path_utils.py # 路径工具 │ ├── locale_manager.py # 语言管理 │ └── config_manager.py # 配置管理 │ ├── locales/ # 语言文件 │ ├── zh_CN.json # 简体中文 │ └── en.json # 英文 │ ├── ffmpeg/ # FFmpeg 可执行文件 │ └── bin/ │ └── ffmpeg.exe # Windows │ ├── 架构.md # 架构文档 ├── 原理.md # 原理文档 └── README_zh.md # 中文说明文档 ``` --- ## 常见问题 ### Q: 录制时提示 "未找到 FFmpeg" **A**: 请确保 FFmpeg 已正确安装: - 如果使用 Release 版本,确保 `ffmpeg/bin/ffmpeg.exe` 存在 - 如果从源码运行,将 FFmpeg 解压到项目根目录的 `ffmpeg/` 文件夹 ### Q: 录制后的视频没有声音 **A**: 请检查以下几点: - 音频录制模式是否设置为"无音频" - 系统音量或麦克风音量是否设置为 0% - FFmpeg 是否正确安装 ### Q: 缩放效果不明显 **A**: 尝试调整以下参数: - 增大"最大缩放倍数"(建议 1.5-2.0) - 减小"平滑速度"(建议 0.1-0.2) - 增大"缩放持续时间"(建议 1.0-2.0 秒) ### Q: 录制过程中卡顿 **A**: 可能的解决方案: - 降低视频质量设置(选择"低"或"中") - 减小录制区域尺寸 - 关闭其他占用资源的程序 - 确保使用独立显卡而非集成显卡 ### Q: 快捷键无效 **A**: - 确保程序窗口处于激活状态 - 检查是否有其他软件占用了相同的快捷键 - 尝试以管理员身份运行程序 --- ## 开发文档 详细的架构说明和原理介绍请参阅: - [架构.md](架构.md) - 系统架构、模块设计、数据流 - [原理.md](原理.md) - 录制原理、缩放算法、音频处理 --- ## 更新日志 ### v1.0.0 (2026-01-XX) - ✨ 初始版本发布 - ✨ 支持智能点击缩放效果 - ✨ 支持四种音频录制模式 - ✨ 支持区域选择和全屏录制 - ✨ 支持暂停/继续功能 - ✨ 支持多语言界面 --- ## 贡献指南 欢迎提交 Issue 和 Pull Request! 1. Fork 本仓库 2. 创建您的特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 打开一个 Pull Request --- ## 许可证 Copyright 2026 Azikaban/Bob8259 本项目采用 [Apache License 2.0](LICENSE) 许可证。 --- ## 联系方式 - GitHub: [@Bob8259](https://github.com/Bob8259) - 项目主页: [https://github.com/Bob8259/OpenFocus](https://github.com/Bob8259/OpenFocus) --- **如果这个项目对您有帮助,请给个 Star ⭐ 支持一下!**