# au3_fenPing
**Repository Path**: chenbool/au3_fen-ping
## Basic Information
- **Project Name**: au3_fenPing
- **Description**: 分屏
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-22
- **Last Updated**: 2026-09-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 📺 分屏直播播放器(AutoIt v3 版)
> 基于 AutoIt v3 + 外部 VLC 进程实现的多分屏直播流播放器,支持实时录制(sout 双路输出,不重拉流、零额外带宽)、断流检测与自动重连、地址记忆。
>
> 参考 lib-vlcsharp(C# WinForms + LibVLCSharp)项目设计,使用 AutoIt v3 重新实现。



> 📷 演示截图可放入 `demo` 目录,README 将在开头自动展示(一行 2 张排版)。
---
## 📋 目录
- [功能特性](#-功能特性)
- [系统要求](#-系统要求)
- [快速开始(小白部署教程)](#-快速开始小白部署教程)
- [使用指南](#-使用指南)
- [技术架构](#-技术架构)
- [项目结构](#-项目结构)
- [配置说明](#-配置说明)
- [常见问题排查](#-常见问题排查)
- [性能优化](#-性能优化)
- [许可证](#-许可证)
---
## ✨ 功能特性
### 🎬 多分屏播放
| 分屏模式 | 布局 | 适用场景 |
|:--------:|:----:|:---------|
| 1 屏 | 1×1 | 单路直播专注观看 |
| 2 屏 | 1×2 | 双路对比监控 |
| 4 屏 | 2×2 | 常规监控场景 |
| 6 屏 | 2×3 | 中等规模监控 |
| **8 屏** | 2×4 | 较大规模监控(默认) |
| 9 屏 | 3×3 | 大规模监控中心 |
| 10 屏 | 2×5 | 宽屏监控 |
| 12 屏 | 2×6 | 宽屏监控 |
| 14 屏 | 2×7 | 超宽屏监控 |
| 15 屏 | 3×5 | 大规模监控 |
| 16 屏 | 2×8 | 超宽屏监控(每行 8 屏) |
| 18 屏 | 3×6 | 超大规模监控 |
### 📡 直播流支持
```
✅ RTSP rtsp://192.168.1.100:554/stream1
✅ RTMP rtmp://server.com/live/stream
✅ HLS https://example.com/live/stream.m3u8
✅ HTTP http://example.com/video.mp4
✅ 本地文件 D:\videos\test.mp4
```
### ⏺ 录制功能
- **方式**: 播放时在 VLC 启动参数挂载 sout 双路输出(`#duplicate{dst=display,dst=std{access=file,mux=ts,dst=...}}`),同一输入流复制一份写文件
- 不重拉流 → **带宽零增加**,即使推流地址签名过期,只要当前连接还在就能继续录
- 无转码 → **CPU 开销极小**,直接保存推流原始数据
- 注意:开始/停止录制瞬间画面会短暂重连一次(约 1~3 秒),这是 VLC 3.0 的技术限制
- **格式**: TS(.ts),推流数据原样写入,无重编码
- **实时显示**: 录制时长、文件大小
- **保存位置**: 程序目录/Recordings/(可配置)
- **命名规则**: `Record_播放器编号-yyyy-MM HH时mm分ss秒.ts`
### 🌐 网络稳定性(断流检测 + 自动重连)
- **断流检测**: 播放网络流时,通过 RC 接口查询 `get_time` 对比是否推进(直播流 `position` 恒 0 不可靠),超过 15 秒无新数据 → 状态栏红色提示(不弹窗阻塞界面)
- **自动重连**: 检测到中断自动重拉流,最多尝试 5 次、间隔 3 秒(均可在配置文件调整);**带签名/时效验证的地址**只尝试 1 次,失败后提示"地址可能已过期,请重新获取新地址后粘贴播放"
- **VLC 层加固**: `:rtsp-tcp` 强制 TCP、`:http-reconnect` 自动重连、`:drop-late-frames`/`:skip-frames` 抗网络抖动
### 💾 地址记忆
- 每次退出时自动保存所有分屏的地址到 `urls.config`,下次启动自动恢复填充
### 🎨 界面特性
- **响应式布局**: 窗口放大/缩小/最大化时,播放器网格、URL 输入框、录制信息自动拉伸适配
- **最小窗口限制**: 防止窗口过小导致布局错乱(最小 660×420,确保工具栏按钮完整显示),支持最大化按钮
- **Windows 默认配色**: 采用 Windows 系统标准浅色主题,与系统窗口视觉一致,护眼且符合用户习惯
- **16:9 视频区**: 每个单元格视频区按 16:9 比例显示,在可用空间中垂直居中,适配手机/监控画面比例
- **小白友好**: 每个按钮有悬浮提示,地址错误弹出通俗说明,无需查阅文档即可上手
---
## 💻 系统要求
| 项目 | 要求 |
|:-----|:-----|
| 操作系统 | Windows 10/11 |
| AutoIt | AutoIt v3.3.14+(运行环境) |
| VLC | VLC 3.0+(视频引擎,需单独安装) |
| 内存 | ≥ 4 GB(多路同时播放建议 ≥ 8 GB) |
| 显卡 | 支持硬件解码(推荐,多路播放关键) |
---
## 🚀 快速开始(小白部署教程)
### 第一步:安装 VLC 播放器(必须)
本程序依赖 VLC 作为视频引擎,**必须先安装 VLC**:
1. 打开 VLC 官方下载页:
2. 下载 Windows 64 位版本并安装(默认路径即可)
3. 安装完成后,VLC 路径通常为 `C:\Program Files\VideoLAN\VLC\vlc.exe`
> 💡 若使用**便携版 VLC**,无需安装,但需在 `config\settings.ini` 中手动指定路径(见[配置说明](#-配置说明))。
### 第二步:安装 AutoIt v3(运行环境)
1. 下载 AutoIt v3:
2. 安装完成后,本项目的 `run.bat` 默认从 `..\au3\autoit-v3\AutoIt3.exe` 调用
3. 若 AutoIt 安装在其他路径,请修改 `run.bat` 中的路径
### 第三步:运行程序
**方式一:双击 run.bat(最简单)**
双击项目根目录的 `run.bat`,程序自动启动。
**方式二:命令行运行**
```bat
cd /d E:\code\fenPing
E:\code\au3\autoit-v3\AutoIt3.exe fenPing.au3
```
**方式三:编译为 exe(可选)**
```bat
E:\code\au3\autoit-v3\Aut2Exe\Aut2Exe_x64.exe /in fenPing.au3 /out fenPing.exe
```
编译后双击 `fenPing.exe` 即可运行(仍需 VLC)。
### VLC 安装(三选一)
**方式 A:便携版 VLC(推荐,免安装)**
将便携版 VLC 解压到项目 `bin` 目录,程序启动时自动检测:
```
fenPing/
├── bin/
│ └── vlc-3.0.23/ # 解压后的 VLC 目录
│ └── vlc.exe
└── fenPing.au3
```
无需任何配置,程序自动扫描 `bin` 目录下所有子目录的 `vlc.exe`。
**方式 B:系统安装 VLC**
从 [VLC 官网](https://www.videolan.org/vlc/) 下载安装包,正常安装即可。程序自动检测系统安装的 VLC。
**方式 C:手动指定路径**
在 `config\settings.ini` 中设置 `[VLC] VlcPath` 为 VLC 完整路径。
### 首次启动
- 程序自动检测 VLC(优先扫描 `bin` 目录便携版,再查系统安装),若未找到会弹窗提示
- 默认显示 8 分屏,每个分屏有独立的地址输入框和控制按钮
- 上次的分屏地址会自动恢复(如有)
---
## 📖 使用指南
### 基本操作流程
```
1. 选择分屏数量(顶部下拉框,默认 8 屏)
↓
2. 在输入框中输入直播流地址(上次地址已自动填充)
↓
3. 点击「播放」按钮(或「粘贴」按钮直接使用剪贴板地址播放)
↓
4. 如需录制,点击「录制」按钮
↓
5. 录制完成后点击「停录」或「停止」
```
### 单个分屏控制
| 按钮 | 功能 |
|:-----|:-----|
| 播放/暂停 | 开始播放 / 暂停当前流 |
| 停止 | 停止播放并结束录制 |
| 录制/停录 | 开始录制 / 停止录制(录制中按钮变红) |
| 粘贴 | 将剪贴板地址填入输入框并立即播放 |
| 音量滑块 | 拖动调节音量,左侧实时显示当前值 |
### 批量操作(顶部工具栏)
| 按钮 | 功能 |
|:-----|:-----|
| 全部播放 | 同时播放所有已输入地址的播放器(地址全空时提示) |
| 全部停止 | 停止所有播放器 |
| 全部录制 | 切换所有正在播放分屏的录制状态(未播放的跳过) |
| 清空所有 | 清空所有地址并重置状态(需确认,防误点丢失地址) |
### 录制文件管理
```
程序目录/
├── fenPing.au3 / fenPing.exe
├── urls.config # 上次使用的分屏地址(自动保存/恢复)
├── vlc_debug.log # 诊断日志(排查问题用)
├── Recordings/ # 录制文件目录
│ ├── Record_1-2026-08-22 19时16分01秒.ts
│ ├── Record_2-2026-08-22 19时16分01秒.ts
│ └── ...
└── ...
```
**播放录制文件**: 使用 VLC、PotPlayer 等播放器直接打开 `.ts` 文件即可。
**防同名覆盖**: 文件名时间戳精确到秒,若同一秒内对同一屏连续录制(停止后立即再录)生成同名文件,程序自动追加 `_2`、`_3`... 序号后缀,避免覆盖已有录制。
---
## 🏗️ 技术架构
### 核心方案:AutoIt GUI + 嵌入外部 VLC 进程
```
┌─────────────────────────────────────────────────────────────┐
│ AutoIt 主进程 (fenPing.au3) │
│ ├── GUICreate 主窗口 + 工具栏 + 分屏网格 │
│ ├── 每个分屏创建一个黑色 Label 作为视频容器 │
│ ├── Run() 启动 vlc.exe,通过 --drawable-hwnd 嵌入视频 │
│ ├── 通过 RC 接口 (stdin/stdout) 控制 VLC(暂停/音量/位置查询) │
│ └── AdlibRegister 定时断流检测 + 录制信息刷新 │
└─────────────────────────────────────────────────────────────┘
↓ 启动 N 个 VLC 子进程
┌─────────────────────────────────────────────────────────────┐
│ vlc.exe -I rc --drawable-hwnd=<句柄> <全局参数> <选项> │
│ ├── --drawable-hwnd: 视频输出嵌入 AutoIt 控件 │
│ ├── -I rc: 远程控制接口(stdin 发命令控制) │
│ ├── --avcodec-hw=any: 硬件解码(多路播放关键) │
│ └── :sout=#duplicate{...}: 录制双路输出 │
└─────────────────────────────────────────────────────────────┘
```
### 模块设计
| 模块 | 职责 |
|:-----|:-----|
| `Constants.au3` | 全局常量(配色/尺寸/超时/分屏选项/签名参数) |
| `Logger.au3` | 诊断日志(vlc_debug.log,5MB 上限,超限自动备份 .bak) |
| `Config.au3` | 配置加载与合法性校验、VLC 路径检测、地址记忆 |
| `ScreenLayout.au3` | 分屏行列计算、单元格坐标计算 |
| `UiHelpers.au3` | 友好提示、文件大小格式化、URL 校验、VLC 选项生成 |
| `VlcEngine.au3` | VLC 进程封装(启动/停止/RC 控制/sout 录制) |
| `NetworkMonitor.au3` | 断流判定与重连策略(纯函数) |
| `PlayerCell.au3` | 单元格 UI + 业务逻辑(播放/停止/录制/断流/重连) |
| `fenPing.au3` | 主入口(主窗体/工具栏/消息循环/退出处理) |
### VLC 启动参数(与 lib-vlcsharp 对齐)
```
vlc.exe -I rc --rc-quiet --drawable-hwnd=<句柄> --no-one-instance
--no-video-title-show --network-caching=300 --avcodec-hw=any
--avcodec-threads=2 --no-stats --no-osd --no-spu --live-caching=200 --quiet
--volume=160 "" :rtsp-tcp :network-caching=500 :drop-late-frames :skip-frames
```
### 录制方式(sout 双路输出)
```
:sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst='E:\...\Record_1-2026-08 19时16分01秒.ts'}}
```
同一输入流复制一份封装为 TS 写文件,不重拉流、零额外带宽、无转码。路径用单引号包裹,含单引号时自动转义。
---
## 📁 项目结构
```
fenPing/
├── 📄 fenPing.au3 # 主程序入口
├── 📄 run.bat # 一键运行脚本
├── 📁 includes/ # 模块目录
│ ├── 📄 Constants.au3 # 全局常量
│ ├── 📄 Logger.au3 # 日志模块
│ ├── 📄 Config.au3 # 配置读写与校验
│ ├── 📄 ScreenLayout.au3 # 分屏布局计算
│ ├── 📄 UiHelpers.au3 # UI 辅助与 URL 校验
│ ├── 📄 VlcEngine.au3 # VLC 进程封装(核心引擎)
│ ├── 📄 NetworkMonitor.au3 # 断流检测与重连策略
│ └── 📄 PlayerCell.au3 # 播放器单元格(UI+逻辑)
├── 📁 config/
│ └── 📄 settings.ini # 配置文件
├── 📁 bin/ # 便携版 VLC 目录(可选,程序自动检测)
│ └── 📁 vlc-3.0.23/
│ └── 📄 vlc.exe # 便携版 VLC 可执行文件
├── 📁 demo/ # 演示截图目录(可放运行截图)
├── 📁 Recordings/ # 录制文件目录(运行时自动创建)
├── 📄 urls.config # 分屏地址记忆(运行时自动生成)
└── 📄 vlc_debug.log # 诊断日志(运行时自动生成)
```
---
## 🔧 配置说明
配置文件 `config\settings.ini`:
```ini
[VLC]
; VLC 路径,留空则自动检测。便携版需手动指定完整路径。
VlcPath=
[Screen]
; 默认分屏数量(1 2 4 6 8 9 10 12 14 15 16 18)
DefaultCount=8
[Record]
; 录制保存目录,留空则用程序目录下 Recordings
SaveDir=
[Network]
StallTimeout=15 ; 断流判定阈值(秒,5-120)
MaxReconnect=5 ; 最大重连次数(1-20)
ReconnectInterval=3000 ; 重连间隔(毫秒,500-60000)
[Player]
DefaultVolume=80 ; 默认音量(0-100)
NetworkCaching=300 ; 网络缓存(毫秒,50-10000)
[Window]
Width=1400 ; 窗口宽度(不小于 660,不超过屏幕宽度)
Height=900 ; 窗口高度(不小于 420,不超过屏幕高度)
```
> 配置项非法时程序自动回退默认值并弹窗提示,不会崩溃。
---
## ❓ 常见问题排查
**Q: 启动时提示"未检测到 VLC"?**
A: 本程序依赖 VLC 视频引擎。请到 下载安装 VLC 3.0+,安装后重新启动本程序。若使用便携版,在 `config\settings.ini` 的 `[VLC] VlcPath=` 填入 vlc.exe 完整路径。
**Q: 点击播放后画面是黑的/没有视频?**
A:
1. 确认 VLC 已正确安装且版本 ≥ 3.0
2. 检查流地址是否正确(在 VLC 播放器中单独测试该地址能否播放)
3. 查看 `vlc_debug.log` 是否有报错
4. RTSP 流尝试加认证:`rtsp://user:password@ip:port/stream`
**Q: 多路同时播放时卡顿?**
A:
1. 程序已启用硬件解码(`--avcodec-hw=any`)和线程限制(`--avcodec-threads=2`)
2. 打开任务管理器观察 CPU/GPU:硬解生效应 CPU 低、GPU 高;若 CPU 仍高说明显卡不支持硬解
3. 降低分辨率或减少分屏数量
4. 确认内存 ≥ 8GB(多路 1080p 建议)
**Q: 推流中断后画面定格不动?**
A: 程序通过 VLC RC 接口查询 `get_time` 对比播放时间是否推进(直播流 `position` 恒 0 不可靠,改用 `get_time`),超过 15 秒无进展判定为断流,状态栏红色提示并自动重连(最多 5 次,间隔 3 秒,均可通过配置文件调整)。检测采用轮询单个单元格(300ms 间隔)避免阻塞界面,窗口最小化时自动跳过节省 CPU。带签名/时效地址(`?txSecret=...`、`?auth_key=...`)只重连 1 次并提示换新地址。请同时检查推流源与网络。
**Q: 录制文件无法播放/未生成?**
A:
1. 确保录制完整结束(点击停录或停止按钮)
2. 查看 `vlc_debug.log` 中 `[录制]` 日志,确认 sout 链是否挂载成功
3. 使用 VLC / PotPlayer 播放(TS 容器兼容性好)
4. 若录制中途推流中断,文件可能不完整,属正常现象
**Q: 切换分屏后地址丢失?**
A: 不会。切换分屏时程序按索引保存当前地址并恢复到新分屏对应位置。退出时也会保存到 `urls.config`,下次启动自动恢复。
**Q: 配置文件修改后不生效?**
A: 修改 `config\settings.ini` 后需重启程序。若配置项非法,程序启动时会弹窗提示并自动回退默认值。校验包括:分屏数量、断流超时(5-120秒)、重连次数(1-20)、重连间隔(500-60000ms)、音量(0-100)、网络缓存(50-10000ms)、窗口尺寸(不小于 660×420 且不超过屏幕分辨率)、录制路径(不含逗号或右花括号、可写入)、VLC 路径存在性(区分目录与文件)。
**Q: run.bat 提示找不到 AutoIt3.exe?**
A: `run.bat` 默认从 `..\au3\autoit-v3\AutoIt3.exe` 调用。若 AutoIt 安装在其他路径,请编辑 `run.bat` 修改路径,或直接用完整路径运行:`E:\code\au3\autoit-v3\AutoIt3.exe fenPing.au3`
---
## 📊 性能优化
| 优化项 | 方法 |
|:-------|:-----|
| 硬件解码 | `--avcodec-hw=any` 启用 GPU 加速 |
| 解码线程限制 | `--avcodec-threads=2` 限制每路线程数,18 路全开时避免线程爆炸 |
| 功能瘦身 | `--no-stats`/`--no-osd`/`--no-spu`/`--quiet` 关闭统计/OSD/字幕/日志 |
| 直播缓冲 | `--live-caching=200` 降低直播源缓冲 |
| TCP 传输 | RTSP 启用 `:rtsp-tcp` 提高稳定性 |
| 自动重连 | `:http-reconnect` + 程序层定时重连 |
| 抗抖动 | `:drop-late-frames`/`:skip-frames` 网络抖动时保持实时 |
| 录制开销 | sout 双路输出直接写文件,零转码、零额外带宽 |
| 录制防同名 | 时间戳到秒 + 文件存在检测追加 `_2`/`_3` 序号,避免快速连续录制覆盖 |
| 断流检测 | `get_time` 对比推进(修复直播流 `position` 恒 0 误判)+ 轮询单格(300ms 间隔)+ 窗口最小化时跳过省 CPU |
| VLC 进程清理 | 全局 PID 跟踪数组,退出时只杀本程序启动的 VLC,不误杀用户其他 VLC |
| 布局计算 | `_Cell_CalcLayout` 统一单元格内控件坐标;`_Cell_GetAllRects` 统一网格行列计算,消除创建/重排重复 |
| 引擎复用 | `_Cell_StopVlc`/`_Cell_QueryTime`/`_Cell_TogglePlayPause`/`_Cell_SetVolume` 复用 VlcEngine 函数,消除重复 RC 命令逻辑 |
| 协议识别 | `_UI_GetProtocolType` 统一协议判断,消除 `_UI_IsNetworkStream`/`_UI_ValidateUrl`/`_UI_GetStreamOptions` 三处重复 |
| 录制按钮 | `_Cell_UpdateRecordButton` 封装录制按钮样式切换,与 `_Cell_UpdatePlayButton` 对称 |
| 死代码清理 | 删除 7 个未使用函数(`_VlcEngine_GetPosition`/`_VlcEngine_IsPlaying`/`_VlcEngine_Pause`/`_VlcEngine_Resume`/`_Layout_CalcCellRect`/`_Layout_IsSupported`/`_NetMon_IsSignedUrl`) |
| 防御性校验 | `WinGetClientSize` 返回非数组时回退默认尺寸;`urls.config` 键名非数字时跳过(防覆盖索引 0) |
| PID 跟踪 | `_VlcEngine_UntrackPid` 停止时移除 PID,防止跟踪数组无限膨胀(长时运行+反复重连场景) |
| 断流容错 | `get_time` 恒 0 的直播流(从未推进 `$F_HAS_PLAYED=0`)不误判断流,避免反复重连 |
| 配置校验 | 11 项配置合法性校验(含窗口尺寸上限、录制路径非法字符),异常自动回退默认值并提示 |
| 配置校验修复 | 修复 `IsNumber` 对 INI 字符串返回 False 导致数值配置校验全部失效的严重 Bug |
| 音量数值显示 | 滑块左侧实时显示当前音量值,拖动时同步更新 |
| 录制文件名 | 补充 `@MDAY`(日),跨天录制文件名可正确区分日期 |
| VLC 便携版 | 自动扫描 `bin` 目录下所有子目录的 `vlc.exe`,兼容任意版本号,免配置 |
| 窗口尺寸缩放 | 超过屏幕分辨率时缩到屏幕 95%(非回退默认值,避免默认值也超标的死循环) |
| 配置类型 | `IniRead` 返回字符串经 `Number()` 转换后写入全局变量,确保数值类型一致 |
| 响应式布局 | 窗口尺寸变化时重算所有控件位置,适配不同屏幕 |
| 16:9 视频区 | 单元格视频区按 16:9 比例显示,在可用空间垂直居中,控制面板始终贴底 |
| 最大化按钮 | 窗口支持最大化/还原,最小尺寸 660×420 防布局错乱 |
| 日志轮转 | 超过 5MB 自动备份为 .bak 再重新写入,保留最近历史便于排查 |
| sout 单引号转义 | 录制路径含单引号时自动转义(`'\''`),避免破坏 VLC sout 链 |
| HLS 抗抖动 | HLS 流加 `:drop-late-frames`/`:skip-frames`,与其他协议一致 |
| 地址保存安全 | `_Config_SaveUrls` 改用 `IniWrite`,URL 含 `=` 等特殊字符不再破坏 INI 解析 |
| 前导零校验 | `urls.config` 键名前导零(如 `00`)不再覆盖索引 0,只接受 `0` 或正整数 |
| 暂停态判断 | `_Cell_IsPlaying` 修复:暂停态(=2)也返回 True,与 `_Cell_TogglePlayPause` 一致 |
| Windows 浅色主题 | 配色改为 Windows 系统标准浅色(浅灰底/黑字/柔和按钮色),护眼且符合用户习惯 |
| 按钮文字色常量 | 新增 `$COLOR_TEXT_ON_BTN` 统一按钮白字,消除硬编码 `0xFFFFFF` |
| 最小窗口尺寸 | 调整为 660×420,确保工具栏按钮完整显示不溢出 |
| StdoutRead 非阻塞 | `_VlcEngine_Stop` 清空缓冲改为非阻塞模式(参数 2),防止进程退出后阻塞 |
| 录制信息节拍 | 录制文件大小刷新从每 300ms 改为每秒一次,18 路全录时 IO 从 60 次/秒降至 18 次/秒 |
| 句柄误删修复 | `_Cell_DestroyAll` 跳过 `$F_HWND` 句柄字段,避免对窗口句柄调用 `GUICtrlDelete` |
| 窗口尺寸上限校验 | 配置窗口尺寸超过屏幕分辨率时缩到 95%,避免创建异常 |
| 便携版 VLC 检测修复 | `_Config_DetectVlc` 用 `FileGetAttrib` 判断目录而非跳过含点号名,修复 `vlc-3.0.23` 无法识别的严重 Bug |
| 配置文件格式校验 | 启动时检查 settings.ini 节完整性,损坏/空文件给出通俗提示 |
| VLC 路径格式校验 | 区分目录与文件,误填目录路径时提示"应指向 vlc.exe" |
| 录制路径可写性测试 | 尝试创建临时文件验证写入权限,权限不足时回退默认目录并提示 |
| URL 获取统一 | 抽取 `_Cell_GetTrimmedUrl` 消除 7 处 `StringStripWS` 重复 |
| 无限重连修复 | `_Cell_StartVlc` 不再重置重连计数,修复 `_Cell_AutoReconnect` 调用 `_Cell_Play` 导致计数清零、永不停止的严重 Bug |
| 重连间隔生效 | `$g_ReconnectInterval` 配置项此前从未被使用,现已生效:新增 `$F_LAST_RECONNECT` 字段,距上次重连不足间隔则跳过等待下次轮询 |
| 重连直接启动 | `_Cell_AutoReconnect` 改为直接调用 `_Cell_StartVlc`(跳过 URL 重复校验),手动播放与自动重连状态管理分离 |
| 全部录制 UX | `_Cell_RecordAll` 仅对正在播放的单元格切换录制,未播放的跳过,避免弹窗刷屏;全无播放时统一提示 |
| 录制停止 IO 优化 | `_Cell_StopRecording` 缓存 FileExists/FileGetSize 结果,消除日志与提示重复检查 |
| 断流检测 URL 复用 | `_Cell_CheckStall` 复用已获取的 `$sUrl`,消除 `$sUrl0` 重复获取 |
| 按钮创建函数 | 抽取 `_Cell_CreateBtn` 统一按钮创建+配色+提示,消除 4 个按钮的重复代码 |
| 二维数组切片修复 | `_Cell_CreateBtn` 改为接收 4 个独立坐标值,修复 AutoIt 不支持从二维数组 `$aL[row]` 切片取一维数组导致运行时崩溃的 Bug |
| StdoutRead 非阻塞 | `_VlcEngine_QueryValue` 清空缓冲改为非阻塞模式,避免潜在阻塞 |
| 粘贴换行符处理 | `_Cell_PasteAndPlay` 去除剪贴板文本中的换行符,防止多行粘贴破坏 URL |
| URL 安全字符校验 | `_UI_ValidateUrl` 拒绝含双引号/换行符的地址,防止破坏 VLC 命令行引号包裹 |
| 暂停/恢复进程检查 | `_Cell_TogglePlayPause` 检查 VLC 进程是否存活,已退出时走停止流程并提示重播,避免界面状态与实际不一致 |
---
## 📜 许可证
本项目参考 lib-vlcsharp(MIT License)设计实现,采用 MIT 开源协议。