Repository navigation
Releases: CGG888/SrcBox
Release list
SrcBox v1.1.21
v1.1.21 Release Notes
Release Date: 2026-10-16
Previous Version: v1.1.20
Highlights
v1.1.20 请用户复现并附上 mpv 日志,本轮日志拿到了,同时读出了两件事。第一件:诊断本身有缺陷。 用户附上的 mpv-20261016.log 只覆盖 1.6 秒,而他在 4 分钟里点了 6 次播放——因为 logs\mpv-<日期>.log 是所有 mpv 实例共用一个文件名,而打开同名文件会截断它,于是设置页的「测试播放」或录制时长探测一开始写日志,主播放器的日志就被整份丢掉:丢的恰好是"回看起不来"那一段。本版改成每个实例一个文件,并只保留最新的 12 个。第二件:302 不是拒绝。 日志显示这套平台(华为 HWServer 入口)对直播请求同样回 302 Moved Temporarily 并跳转到真正持有资产的节点,FFmpeg 跟随跳转后正常出画;所以上一版把 302 当成"服务端不认这个窗口"的说法是不准确的,本版让探测跟随跳转、报出节点的最终裁决,并在跳转地址丢掉 playseek 时明确标注——那才是会退化成直播(或黑屏)的情形。
另外修掉用户在同一份反馈里报的第二个问题:「设置 → 播放 → 记忆与恢复」三个开关保存后不生效(未勾选状态没有被写回实际设置)。归档起播的自动重试也从 1 次提高到 3 次——用户日志显示同一地址往往要第三次请求才出首帧。
- 修复记忆与恢复开关保存不生效:
记住上次使用的列表源/记住每个列表最后播放的频道/记住每个频道选用的源三个开关在保存时没有被写回实际设置,取消勾选后重启仍然照旧。 - mpv 调试日志按实例分文件:
logs\mpv-<日期>-<时间>-<实例>-<序号>.log(如mpv-20261016-112506-main-1.log),主播放器、设置页测试、录制时长探测互不覆盖;同时收敛噪声日志级别,并只保留最新 12 个文件。 - RTSP 探测跟随重定向:
302后继续DESCRIBE跳转地址,一条主日志就能看到"入口 → 节点"的完整链条与最终裁决;跳转地址缺少playseek时输出[重定向丢弃 playseek]。 - 归档起播重试 3 次:回看 / 时移每
max(3, 源超时秒数)秒无画面就换一个新会话再请求,最多 3 次(约 15 秒),日志逐次记录第 N/3 次请求。 - 「导出日志」改为打包 zip:F1 调试窗口的一次导出会带上播放器日志、调试日志与最新的 4 个 mpv 日志(打包而不是只复制主日志),反馈问题时附这一个文件即可。
- 测试:576 个用例,575 通过 / 1 跳过 / 0 失败;新增 9 例(重定向跟随 2 例、记忆开关写回 2 例、mpv 日志文件名与清理 2 例、日志打包 3 例)。
1. 记忆与恢复开关保存不生效(已修)
| 开关 | 取消勾选后本应停止的行为 |
|---|---|
| 记住上次使用的列表源 | 启动时不再自动载入上次的列表源 |
| 记住每个列表最后播放的频道 | 切换回某个列表时不再自动续播该列表的频道 |
| 记住每个频道选用的源 | 不再记住手动切换过的线路 |
三个开关在设置窗口里能正常勾选 / 取消,但保存时只有"表单 → 临时配置"这一半;把配置写回实际设置的那一步漏掉了这三个字段,所以重启后行为不变,重新打开设置页又变回勾选状态——看起来就是"取消不掉"。本版补齐写回,并补了回归用例(表单 → 配置 → 实际设置一条链走通)。
2. mpv 调试日志:一个实例一个文件
logs\mpv-20261016-112506-main-1.log 主播放器
logs\mpv-20261016-113002-test-rtsp-3.log 设置页「RTSP 测试」
logs\mpv-20261016-113015-probe-4.log 录制文件时长探测
文件名含实例标签(main / test-http / test-rtsp / probe / multi / player)与进程内序号,同一秒启动两个实例也不会撞名。同时把 msg-level 收敛为 all=v,vo=warn,vf=warn,af=warn,ao=warn,osd=warn:着色器与滤镜图的调试输出(轻易上百 KB)不再进文件,RTSP / FFmpeg / demuxer 的细节照旧保留。mpv 日志只保留最新 12 个文件,避免长期开调试模式占满磁盘。
反馈播放问题时请附上
logs目录下最新的mpv-*.log(主日志标签main) 与同时间段的SrcBox-*.log。
3. RTSP 探测跟随重定向
探测不再止步于第一个响应,而是沿 Location 继续问下去(最多 2 跳):
[Replay] RTSP 探测: RTSP/1.0 302 Moved Temporarily (SDP=no, HWServer/1.0) → rtsp://121.31.11.79:554/PLTV/.../x.smil?...&playseek=20261015220000-20261015223600 → RTSP/1.0 200 OK (SDP=yes, HWServer/1.0)
判断方式:
| 探测结果 | 含义 |
|---|---|
末跳 200 OK (SDP=yes) |
服务端愿意提供这个 playseek 窗口 → 播不出来是链路 / 解码层面的事 |
末跳 454 / 404 / 503 |
服务端不认这个窗口或这个资产(换参数或等运营方) |
跳转地址后带 [重定向丢弃 playseek] |
跳转目标没有回看参数,按该地址播放会变成直播(或黑屏)——这时需要预解析跳转并在跳转地址上补回参数 |
只有 302 且没有 Location |
入口没有给出节点地址 |
探测只在调试模式下执行,一条 DESCRIBE 不建立媒体会话。
4. 归档起播重试 3 次
| 项目 | 说明 |
|---|---|
| 触发条件 | 回看 / 时移模式下,max(3, 源超时秒数) 秒(默认 5 秒)内仍无画面 |
| 动作 | 用同一地址换一个新会话重新请求,等待窗口重置;日志:[Playback] 归档起播 5.1s 未见画面,第 2/3 次请求 URL=… |
| 次数 | 一个回看窗口最多 3 个会话(约 15 秒),之后才记录 起播…未见画面 |
| 直播 | 不参与重试:直播有自己的源超时 / 自动降级链路 |
依据:用户日志里同一条 playseek 地址,第一、二次会话 5 秒不出画,第三次在 1 秒内出首帧——服务端对回看窗口常常只有后面的会话才应答。
5. 「导出日志」打包 zip
F1 调试窗口的「导出日志」不再只复制一份播放器日志,而是把同一次复现需要的文件打包成一个 zip:
| 内容 | 说明 |
|---|---|
SrcBox-YYYYMMDD.log |
播放器日志(含 [Replay]、RTSP 探测、起播…未见画面) |
SrcBox-YYYYMMDD.debug.log |
调试模式下的详细日志(存在时) |
mpv-*-<实例>-*.log |
最新的 4 个 mpv 日志,其中 -main- 是主播放器 |
打包读取 mpv 日志时使用共享读,mpv 正在播放、日志文件被占用也能导出。
6. Known Issues
- 回看能否成功最终取决于服务端:本版把"回看起不来"的取证补齐(完整 mpv 日志 + 跟随跳转的探测结论),若某个源仍不播,请把
logs\mpv-*-main-*.log与主日志里的[Replay]行发到 issue。 - 「时移」拖动仍旧是按新时间点重新请求回看地址(中转式回看流在播放器内部不可 seek),因此每次拖动都会新建一个会话;服务端会话数受限的源可能出现"拖太快就不出画"。
- 若 SrcBox 运行在受限完整性级别下(例如程序目录被安全策略或沙箱标记为 Low Integrity、进程被降权),它无法写入用户配置目录、也无法创建用户密钥容器,HTTPS 因此不可用;此时页面与二维码会自动给出
http://。这类限制来自运行环境,不是程序缺陷。 - 语音词表的识别层热词本版未启用(当前模型不支持热词嵌入);词表包仍作用于指令解析层。
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;本版未处理。
Contributors
感谢以下用户的贡献:
- @bnnz1085199 - 提供广西联通 RTSP 单播回看的第二份日志(
SrcBox+mpv双日志),既定位到"mpv 日志被其他实例截断"的诊断缺陷,也报告了「记忆与恢复」开关保存不生效的问题 (#6) - @Neverends4 - 报告重庆联通 RTSP 单播源缺少回看 / 时移格式,并提供频道列表与抓包资料 (#6)
Download
SrcBox v1.1.20
v1.1.20 Release Notes
Release Date: 2026-10-16
Previous Version: v1.1.19
Highlights
本版继续跟进 issue #6 的现场反馈(广西联通 RTSP 单播)。v1.1.19 的「拖动进度条重发回看地址」已确认生效——用户日志里 时间轴跳转 之后确实发出了新的回看请求;但部分频道的回看流仍然起不来,而播放器内部看不到服务端到底回了什么。本版把这件事变成可诊断 + 自动多试一次:回看流 5 秒没出画面会自动用同一地址重发请求;打开调试模式后,mpv 自身的日志(含 FFmpeg 的 RTSP 细节)会落盘到 logs\mpv-YYYYMMDD.log,并且每次回看前会对 RTSP 地址做一次 DESCRIBE 探测,把服务端的裁决(200 / 454 / 404 / 503)写进日志。
- 归档起播自动重试:回看 / 时移 5 秒未出画面 → 用同一地址重发一次再判定失败(用户此前手动点第二次往往就能播)。
- mpv 自身日志落盘:调试模式下生成
logs\mpv-YYYYMMDD.log,包含Opening rtsp://…、FFmpeg 与 demuxer 的完整消息;启动时会在主日志里打印文件路径。 - RTSP 回看探测:调试模式下,每次回看前对回看地址发一次
DESCRIBE,日志写[Replay] RTSP 探测: RTSP/1.0 200 OK (SDP=yes, Server=…)或454 Session Not Found;只在调试模式运行,不影响正常播放,也不额外建流会话。 - 调试模式可记住:F1 调试窗口里开启后写入设置,重启仍然生效(mpv 日志与探测都在启动时挂载,所以要重启一次)。
- 测试:567 个用例,566 通过 / 1 跳过 / 0 失败;新增 9 例(起播重试策略 5 例、RTSP 探测 4 例,探测用例用真实 socket 模拟运营商应答)。
1. 归档起播自动重试
| 项目 | 说明 |
|---|---|
| 触发条件 | 回看 / 时移模式下,播放开始后 max(3, 源超时秒数) 秒内仍无画面(默认 5 秒) |
| 动作 | 用同一地址再发一次播放请求,并把等待窗口重置;日志:[Playback] 归档起播 5.2s 未见画面,重试一次 URL=… |
| 次数 | 每次加载只重试 1 次;再失败才记录 起播…未见画面(沿用原日志) |
| 直播 | 不参与重试:直播有自己的源超时 / 自动降级链路,避免两者互相干扰 |
依据:用户日志里同一频道同一地址,第三次请求就出现了首帧——说明中转服务对这类回看窗口经常只是第一次不应答。
2. mpv 自身日志(调试模式)
以前只有播放器自己的日志,起播5s未见画面 之后就没有下文了。现在打开调试模式(F1 → 调试模式)并重启一次,程序会给 mpv 挂上 log-file 与 msg-level=all=v:
[mpv] 调试日志已开启: D:\...\logs\mpv-20261016.log(反馈播放问题时请一并附上)
文件里能看到播放器层面看不到的东西,例如:
[v][stream_callback] Opening rtsp://103.251.96.219/PLTV/.../x.smil?playseek=20261015220000-20261015223600
[v][ffmpeg] Opening rtsp://...
[v][lavf] Found 'rtsp' at score=100 size=0 (forced).
[d][ffmpeg] tcp: Starting connection attempt to 103.251.96.219 port 554
DEBUG 模式下会写 logs\mpv-*.log(与其他日志一样按 7 天清理),平时不开调试模式就不会产生。
3. RTSP 回看探测
调试模式下,每次回看 / 时移请求发出前会先问服务端一句:
[Replay] RTSP 探测: RTSP/1.0 200 OK (SDP=yes, Server=...)
[Replay] RTSP 探测: RTSP/1.0 454 Session Not Found (SDP=no, Server=...)
200 + SDP 表示服务端愿意提供这个 playseek 窗口,播不出来就是链路/解码层面的问题;454 / 404 / 503 表示服务端不认这个窗口或这个资产(那就得换参数或等运营方)。DESCRIBE 不会建立媒体会话,且只在调试模式执行。
4. Known Issues
- 回看能否成功最终取决于服务端:本版提供了重试、mpv 日志与 RTSP 探测三件工具,若某个源仍然不播,请把
logs\mpv-*.log与主日志里的[Replay]行一起发到 issue——有这两样就能判断是"参数不对"还是"该频道没有回看资产"。 - 若 SrcBox 运行在受限完整性级别下(例如程序目录被安全策略或沙箱标记为 Low Integrity、进程被降权),它无法写入用户配置目录、也无法创建用户密钥容器,HTTPS 因此不可用;此时页面与二维码会自动给出
http://。这类限制来自运行环境,不是程序缺陷。 - 语音词表的识别层热词本版未启用(当前模型不支持热词嵌入);词表包仍作用于指令解析层。
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段);菜单构建仍会累积内部菜单项引用,本版未改动。
Contributors
感谢以下用户的贡献:
- @bnnz1085199 - 提供广西联通 RTSP 单播回看的完整现象日志(能播能拖 / 点回放不播 / 某时段能播不能拖),直接定位到"回看窗口首次请求不应答"与"缺少服务端裁决信息"两个问题 (#6)
- @Neverends4 - 报告重庆联通 RTSP 单播源缺少回看 / 时移格式,并提供频道列表与抓包资料 (#6)
Download
SrcBox v1.1.19
v1.1.19 Release Notes
Release Date: 2026-10-15
Previous Version: v1.1.18
Highlights
本版集中解决「回看为什么播不了、拖不动」这一类现场问题:补上 Kodi / APTV 那一套时间占位符({utc} 这类写法以前会原样留在请求里,服务端当然不认),设置页新增 8 种常用回看格式一键套用;RTSP 单播回看在频道没有 EPG 节目时也能拖动进度(改为按新时间点重发回看地址);顺带把更新红点做可靠——镜像表内嵌进程序、每次启动检查一次、失败会在日志里说明每个源为什么失败,并修掉「按住说话第一个字被吞」。
- 回看 / 时移格式补齐 Kodi 词汇:支持
{utc}、{utcend}、{lutc}、${start}、${end}、${now}、{Y}{m}{d}{H}{M}{S}、{duration:X}、{offset:X},以及 Kodi 方言的格式串({utc:YmdHM}、${end:Ymd-H-M})——从 APTV / TV Live / IPTV-org 列表里抄过来的catchup-source可以直接用。 - 设置页「常用格式」预设:内置 8 种常见形状(playseek 本地/UTC/Unix 秒、
?time={utc}、starttime/endtime 的 UTC+T 与本地、start+end、start+duration),选中即填入地址格式,不用改 m3u 就能逐个试。 - RTSP 单播回看可拖动:回看态拖动进度条一律按新时间点重发回看地址;没有 EPG 节目时进度条改用「本次请求的回看窗口」当量程,不再退化成 mpv 内部 seek(中转回看流在 mpv 里不可 seek,因此以前拖了没反应)。
- 更新红点更可靠:gh-proxy 镜像表内嵌进程序(发布包里本来从来没有这个文件,GitHub 被墙或限流时检查就静默失败)、每次启动都检测一次、本地代理异常时直连重试一次,并在日志里写明「已是最新版本 / 发现新版本 / 检查失败:哪个源返回了什么」。
- 语音保住句首:按住说话时保持麦克风预热(预滚缓冲 + 松开后补录尾音),不再出现「回看」被听成「谁看」这类第一个字丢失的问题。
- 文档:四种语言的《回看与时移》新增「Kodi 通用词汇」「常用格式预设」「RTSP 单播回看」三节,并修好了该页原有的代码块围栏错误。
1. 回看 / 时移:Kodi 词汇与常用格式预设
catchup-source 只认 ${(b)...} / ${(e)...} / {utc:...} 这一套时,用户照着 Kodi(pvr.iptvsimple)文档写 ?time={utc} 会被原样塞进请求——issue #6 里重庆联通的反馈就是这个现象(服务端收到字面量 {utc},回看自然播不了)。
新增的占位符:
| 占位符 | 含义 |
|---|---|
{utc}、${start} |
开始时间的 UTC Unix 秒(10 位) |
{utcend}、${end} |
结束时间的 UTC Unix 秒(10 位) |
{lutc}、${now} |
当前时间的 UTC Unix 秒(10 位) |
{Y}、{m}、{d}、{H}、{M}、{S} |
开始时间的年 / 月 / 日 / 时 / 分 / 秒(本地时间) |
{duration:X} |
窗口长度除以 X(如 {duration:60} 为分钟) |
{offset:X} |
当前时间与开始时间之差除以 X |
说明:
{utc:FORMAT}/{utcend:FORMAT}/${start:FORMAT}/${end:FORMAT}都支持:写成 Kodi 方言(只用Y m d H M S,如{utc:YmdHM})按 Kodi 含义翻译;写成 .NET 格式(如${utc:yyyyMMddHHmmss})原样使用。- 两套方言里
m/M含义相反(Kodi 的m是月、M是分,.NET 反之),不确定时用yyyyMMdd…写法。 ${timestamp}在 SrcBox 里仍表示窗口开始时间(历史行为,文档一直如此);要「当前时间」请写{lutc}或${now}。Kodi 的{catchup-id}(XMLTV 节目级 ID)暂不支持。
设置 → 回放设置 / 时移设置新增「常用格式」下拉,8 个预设全部是「仅参数段」,会拼到该频道直播地址后面(直播地址已带 ? 时用 &,鉴权参数原样保留):
| 预设 | 模板 |
|---|---|
| playseek 开始-结束(本地时间,中兴/PLTV 常用) | ?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss} |
| playseek 开始-结束(UTC 时间) | ?playseek=${utc:yyyyMMddHHmmss}-${utcend:yyyyMMddHHmmss} |
| playseek 开始-结束(Unix 秒) | ?playseek=${timestamp}-${end_timestamp} |
| 单个 Unix 时间戳(Kodi/APTV 常用) | ?time={utc} |
| starttime/endtime(UTC + T,华为/魔百和常用) | ?starttime=${(b)yyyyMMdd|UTC}T${(b)HHmmss|UTC}&endtime=${(e)yyyyMMdd|UTC}T${(e)HHmmss|UTC} |
| starttime/endtime(本地时间) | ?starttime=${(b)yyyyMMddHHmmss}&endtime=${(e)yyyyMMddHHmmss} |
| start/end(Unix 秒) | ?start=${timestamp}&end=${end_timestamp} |
| start + duration(Unix 秒) | ?start=${timestamp}&duration=${duration} |
2. RTSP 单播回看:进度条可以拖了
| 现象 | 原因 | 本版 |
|---|---|---|
| 回看能播,但拖动进度条没有反应 | 频道没有 EPG 节目时,拖动会退化成对回看流做 mpv 内部 seek,而中转式回看流(playseek)在 mpv 里不可 seek | 一律按新时间点重发回看地址 |
| 进度条量程是空的 / 拖不动 | 量程取自 mpv 报告的时长,RTSP 回看流通常没有时长 | 没有节目时量程 = 本次请求的回看窗口(起止时间),拖动后窗口跟着走 |
| 拖动越界请求了还没产生的时段 | 没有夹取 | 目标时间夹在窗口内(右端留 1 秒) |
仍然取决于服务端的一点:「点回放完全播不了」属于源端是否认这个参数——同一份 m3u 在 PotPlayer / APTV 能播、在 SrcBox 不能播的情况,需要拿到实际回看地址才能定位;本版的做法是把「格式可以试、拖动可用、日志可查」补齐。
3. 更新红点:内置镜像 + 每次启动检测
| 问题 | 说明 |
|---|---|
| 镜像表从来没进过发布包 | 清单唯一副本是 docs/public/screenshots/cdn.md(只发布到文档站),而程序在安装目录里找 docs/cdn.md / docs/screenshots/cdn.md,publish 产物里连 docs\ 都没有 → 镜像列表恒为空,api.github.com 一旦被墙或限流,检查就静默失败、红点永远不亮 |
| 每天只查一次 | 24 小时节流 + 「同一版本不重复查」,导致刚发布的新版本要等到第二天才可能亮红点 |
| 本地代理一挂就查不到 | 共享 HttpClient 走系统(WinINET)代理,代理异常时所有源都失败且没有任何提示 |
本版:镜像表内嵌进程序集(gh-proxy.org / hk.gh-proxy.org / cdn.gh-proxy.org,可在设置里改),每次启动检测一次(仍然是后台静默、不弹窗),所有源都失败时改用直连重试一次,并在日志里留下结论:
[Update] 发现新版本 1.1.19(当前 1.1.18)
[Update] 已是最新版本 1.1.19
[Update] 检查失败: api.github.com=403; gh-proxy.org=超时
4. 语音:保住句首
按住说话时麦克风需要 0.2–0.4 秒才能打开,用户立刻讲话时第一个音节根本没被采到,于是出现「回看」被识别成「谁看/可看」这类第一个字丢失的现象。本版把麦克风保持热:一次命令后 30 秒内不关麦(预滚 800 ms 环形缓冲,按下即可接上),松开后再补录 200 ms 尾音;页面隐藏、取消或超时会立刻彻底关麦(手机录音指示灯不会长亮)。
5. 文档与测试
- 四种语言(中文 / English / 繁體中文 / Русский)的《回看与时移》新增三节:Kodi / APTV / TV Live 通用词汇、常用格式预设(设置页)、RTSP 单播回看(中兴 / PLTV 等);同时修好了该页中文 / 英文版本原有的代码块围栏错误(此前「优先级与覆盖」之后的整段被渲染成代码)。
- 自动化用例总数由 v1.1.18 的 539 通过 / 0 失败 变为 558 个:557 通过 / 1 跳过 / 0 失败(跳过的仍是默认禁用的金样生成用例)。新增覆盖:Kodi 占位符与两套方言、Scaled 的 duration/offset、预设目录与全量展开、无 EPG 节目的回看拖动与量程、设置抽屉的预设交互(真实加载 XAML)、内嵌镜像表与请求顺序、代理失败后的直连重试。
Known Issues
- 回看能否成功仍取决于服务端:运营商私有格式无法穷举,本版提供 8 种常用预设与完整占位符词汇,逐个试到能播为止;调试日志会打印实际请求地址与
[Replay]记录。若某个源怎么试都不行,请把 m3u 里该频道的catchup-source与调试日志发到 issue。 - 若 SrcBox 运行在受限完整性级别下(例如程序目录被安全策略或沙箱标记为 Low Integrity、进程被降权),它无法写入用户配置目录、也无法创建用户密钥容器,HTTPS 因此不可用;此时页面与二维码会自动给出
http://,不会给出打不开的https://。这类限制来自运行环境,不是程序缺陷——把程序放在普通的用户目录下运行即可恢复。 - 语音词表的识别层热词本版未启用:当前使用的 SenseVoice-Small 模型不支持热词嵌入(热词通道只在 SeacoParaformer 投影上生效),需要更换模型,留待后续评估。词表包目前作用于指令解析层(短语 / 时间词 / 噪声词)。
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;面板内部配色已逐像素对齐,该差异仅出现在透明分层窗口边缘,本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段)。
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),沿用上一版的记录,本版未改动。
Contributors
感谢以下用户的贡献:
- @Neverends4 - 报告重庆联通 RTSP 单播源缺少回看 / 时移格式,并提供频道列表与抓包资料 (#6)
- @bnnz1085199 - 报告广西联通 RTSP 单播回看部分频道无法播放、部分时段无法拖动进度,并提供带鉴权的 m3u 样例 (#6)
Download
SrcBox v1.1.18
v1.1.18 Release Notes
Release Date: 2026-10-14
Previous Version: v1.1.17
Highlights
本版把语音遥控从「能听懂一个词」推进到「能听懂一整句」——回看昨天晚上的新闻联播 这类「回看 + 时间 + 频道 + 节目名」的任意组合现在都能直接执行;语音词表(短语 / 时间词 / 噪声词)从程序里独立出来,可以不重装软件单独升级;同时修掉离线语音模型下载被服务器拒绝(403)与断点续传反复失败(416)两个问题,并补上《苹果语音控制》《安卓语音控制》两篇教程。
- 整句语音理解重做:支持日历日期(
10月13号/十三号/2026年10月13日)、星期(上周五/星期一)、汉字数字(十三过去被算成 3)、时段换算(晚上8点过去被当成早上 8 点)与「时间线索」窗口(说8点也能找到 7 点开播的节目),并把已经用于判断时间的词从节目名过滤词里剔除。 - 语音词表包(独立升级):内置短语、介词、噪声词、时段与星期词表改由 JSON 词表包提供,可在 设置 → Web 遥控器 → 语音 里「检查更新」(从 GitHub Release 下载,带校验与失败回退)、导入本地文件、或移除并回到内置词表。
- 语音设置补全:新增匹配严格度(宽松 / 标准 / 严格)、时间线索分钟数、是否识别日历日期、「只有一个匹配就直接回看」(此前有配置、没有界面)、追加过滤词。
- 离线语音模型下载修复:下载请求缺少
User-Agent,被 ModelScope 的 LFS CDN 直接拒绝(403);.part文件已经下满、或服务器拒绝断点续传(416)时下载会永久失败——现在会重置并重新下载。 - 新增教程:《苹果语音控制》(Siri + 快捷指令)与《安卓语音控制》(手机内置助手 + 自定义命令),见文档站「使用指南」。
1. 整句语音理解(回看类指令)
以前「回看 + 时间 / 频道 / 节目名」只要组合两项以上就很难命中,典型表现是要么「没找到」,要么把一堆不相干的节目列成候选。本版把解析拆成「日期 → 时段 → 钟点」三步,再按时间线索在节目单里落点:
| 说法 | v1.1.17 | v1.1.18 |
|---|---|---|
回看20点的新闻联播 |
找不到(20点 混进节目名,且只在 20:00 之后的时段里找) |
回看 19:00 那一档 |
回看晚上8点的新闻联播 |
按早上 8 点找 | 按 20:00 找 |
回看八点的新闻联播 |
时间词混进节目名 | 早上 8 点(与所说时间一致) |
回看十三号的新闻联播 |
日期被忽略(按今天),且汉字「十三」被解析成 3 | 正确落在 13 号 |
回看2026年10月13日的新闻联播 |
找不到 | 正确 |
回看上周五的新闻联播 |
找不到 | 正确 |
回看昨天晚上八点半的新闻联播 |
「半」残留在节目名里,找不到 | 正确 |
回看3台昨天晚上的新闻联播 |
列出 3 个候选 | 回看 3 台 19:00 那一档 |
回看今天的新闻联播 |
连带 体育新闻、新闻大求真 一起给候选 |
只有一个匹配就直接回看 |
解析规则:
| 规则 | 说明 |
|---|---|
| 日历日期 | 10月13号、13号、2026年10月13日;没写年份且算出的是未来日期时,按上一年 / 上一个月回退 |
| 星期 | 星期一 / 周一 / 礼拜一 / 上周五 / 本周(英文、俄文同义说法一并支持) |
| 汉字数字 | 十三、八点半、十点 等一律先转成阿拉伯数字再解析(十三 以前被误算成 3) |
| 时段换算 | 晚上8点 → 20:00,早上8点 → 08:00,凌晨12点 → 00:00,中午12点 → 12:00 |
| 时间线索 | 说出钟点后按「节目开始时间」落点,默认允许提前 60 分钟(可在设置里改 0–240) |
| 槽位拆解 | 已在时间判断里用掉的词(20点、昨天晚上、10月13号、八点半)不再留在节目名过滤词里 |
| 候选降噪 | 弱相似度(半数字符重合,如 体育新闻 vs 新闻联播)在标准严格度下不再进候选 |
2. 语音词表包(独立升级)
语音识别之外的词表——内置短语(20 条)、介词、噪声词、时段表、星期表——全部搬进一份 JSON「词表包」,程序只保留一份内置兜底版本:
| 能力 | 位置 |
|---|---|
| 检查更新 | 设置 → Web 遥控器 → 语音 → 词表包 →「检查更新」:从 voice-pack Release 下载清单,比对版本后下载、校验 SHA-256、原子替换 |
| 导入本地包 | 同一区域的「导入」,选一个 .json 词表包即可生效 |
| 移除 | 「移除」后立即回到内置词表,无需重启 |
| 手动放置 | 把包放到 %LOCALAPPDATA%\SrcBox\voice\pack.json 也会被加载 |
下载顺序为「Release 资产 → 设置里的 CDN 镜像 → jsDelivr」,任何一步失败都会回退,校验不过(大小或 SHA-256 不符、schema 不符、正则无法编译)一律拒绝并保留原有词表;安装失败不影响正在使用的词表。
仓库侧同时提供 voice/manifest.json(清单)、voice/v1/zh-CN.json(与内置表逐字一致的金样包)、voice/schema/*.json,由 .github/workflows/voice-pack.yml 在词汇变更时自动发布——词表因此可以独立于程序版本升级。
说明:包内正则一律带 50 毫秒超时,包大小上限 512 KiB、条目上限 500 条,并拒绝指向目录之外的路径。
3. 语音设置
设置 → Web 遥控器 → 语音新增一组「语义匹配」设置:
| 设置 | 默认 | 作用 |
|---|---|---|
| 匹配严格度 | 标准 | 宽松 / 标准 / 严格,对应候选阈值 0.45 / 0.55 / 0.70,自动执行阈值 0.75 / 0.85 / 0.92 |
| 时间线索(分钟) | 60 | 说出钟点后允许提前多少分钟落点 |
| 识别日历日期 | 开 | 关掉后 10月13号 这类日期不再被解析(按今天算) |
| 只有一个匹配就直接回看 | 开 | 关掉后即使只有一个节目命中也会先让你确认 |
| 追加过滤词 | 空 | 用 ` |
4. 离线语音模型下载修复
| 问题 | 说明 |
|---|---|
| 下载必被拒(403 Forbidden) | 模型 CDN 对不带 User-Agent 的请求直接返回 403(正文字面是 You don't have permission to access the URL on this server),浏览器能下、程序不能下;现在共享 HttpClient 统一带上 SrcBox/<版本> |
| 断点续传永久失败(416) | .part 文件恰好等于远端文件大小时会发出 Range: bytes=<size>-,服务器回 416,旧代码直接抛异常且不清理,重试永远失败;现在检测到 .part 已满会先重置,收到 416 会删除后从零重下 |
| 下载中断后无法恢复 | 断点续传按文件逐个校验,模型 4 个文件的 SHA-256 与发布值一致才算完成;设置页提供「下载 / 校验 / 删除」三个入口 |
5. 新增教程:苹果 / 安卓内置语音控制
不需要打开 SrcBox 的遥控页面,直接用手机自带的助手也能控制播放器:
- 苹果语音控制(
docs/guide/apple-voice-control.md):用「快捷指令」把一句话变成GET /api/voice?text=...请求,再用 Siri 调用;含快捷指令逐屏配置、令牌与网段校验、以及常见报错。 - 安卓语音控制(
docs/guide/android-voice-control.md):用手机内置助手(小布 / 小爱等)的「自定义命令」指向同一条接口,含命令示例与触发方式。
两篇都基于 Web 遥控器已经开放的 HTTP 语音接口,页面与接口行为见《Web 遥控器》文档。
6. 文档与测试
- 四种语言(中文 / English / 繁體中文 / Русский)的《Web 遥控器》新增两节:语义匹配设置(五个新旋钮)与语音词表包(在线升级、导入、移除、手动放置)。
- 新增《苹果语音控制》《安卓语音控制》两篇教程,并加入文档站侧边栏与使用指南索引。
- 自动化用例总数由 v1.1.17 的 461 通过 / 0 失败 提升到 539 通过 / 0 失败(另有 1 个默认跳过的金样生成用例):新增用例覆盖日期 / 星期 / 汉字数字 / 时段换算 / 时间线索窗口 / 槽位拆解、词表包解析与校验、合并与热加载、SHA-256 与目录穿越防护、安装 / 导入 / 移除流程、清单与镜像回退顺序、模型下载的 416 与已满
.part分支。 - 回看组合句用探针矩阵逐句复核(
回看20点…、回看晚上8点…、回看十三号…、回看3台昨天晚上的…等),确认由「候选」变为直接执行。
Known Issues
- 若 SrcBox 运行在受限完整性级别下(例如程序目录被安全策略或沙箱标记为 Low Integrity、进程被降权),它无法写入用户配置目录、也无法创建用户密钥容器,HTTPS 因此不可用;此时页面与二维码会自动给出
http://,不会给出打不开的https://。这类限制来自运行环境,不是程序缺陷——把程序放在普通的用户目录下运行即可恢复。 - 语音词表的识别层热词本版未启用:当前使用的 SenseVoice-Small 模型不支持热词嵌入(热词通道只在 SeacoParaformer 投影上生效),需要更换模型,留待后续评估。词表包目前作用于指令解析层(短语 / 时间词 / 噪声词)。
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;面板内部配色已逐像素对齐,该差异仅出现在透明分层窗口边缘,本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段)。
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),沿用上一版的记录,本版未改动。
Download
Voice pack 1
Vocabulary SrcBox installs without a new build. The file names are not translated, so a newer version can always be downloaded over an older one.
Voice packs
The manifest that tells SrcBox which vocabulary pack to install. The packs themselves are attached to the voice-pack- releases.
SrcBox v1.1.17
v1.1.17 Release Notes
Release Date: 2026-10-14
Previous Version: v1.1.16
Highlights
本版带来两个新能力——桌面 EPG 时间轴进度条与手机语音遥控(本机离线识别),并修掉一批回看/时移、台标与 Web 遥控器的缺陷:
- EPG 时间轴:窗口底栏与全屏浮层的进度条改造成带节目名、刻度与状态角标的节目时间轴,可点节目跳转、按段翻页、点未来节目直接预约,也能一键切回标准进度条。
- 手机语音遥控:在手机网页上按住麦克风说话,录音上传到播放器后用本地离线模型识别;可以说频道名、频道号,也可以说
下一个台、换源、音量 40、静音、快进 30 秒、回看今天的新闻联播、现在在播什么。 - 回看/时移落点修复:全屏时间轴在回看时把「节目相对秒数」当成绝对时间直接 seek,落点会偏移(偏差恰为已累积的播放推进量);现在统一换算成绝对时间,时移拖动也会被限制在当前缓冲窗口内。
- Web 遥控器加固:台标请求带缓存参数不再 404、
.ico/.bmp有正确类型、WebSocket 发送串行化、语音诊断不再把「授权成功」当故障、HTTPS 证书换网后自动重签。
1. 桌面 EPG 时间轴(新)
窗口底栏与全屏浮层的进度条不再是「一根滑块」,而是把当前频道的节目单画成时间轴:
| 元素 | 说明 |
|---|---|
| 节目段 | 每个节目一个方块,宽度按时长分配,名称过长自动截断并带完整提示;正在播出的节目用进度填充表示已播部分 |
| 刻度尺 | 第一行是时间刻度,鼠标停留显示该位置的时间与命中节目;点击任意位置即跳到该时间点 |
| 状态角标 | 直播(跟随直播边缘)、回看(可点播的已播节目)、时移(落在当前缓冲窗口内)、预约(未来节目) |
| 播放头 / 直播边缘 | 播放头显示当前播放位置,时移时另有直播边缘标记;两者都会随播放推进 |
| 翻页 | 左右两端的 ◀ / ▶ 按节目段前后翻页,只改变时间轴的浏览时段,不会跳转播放 |
操作:
| 操作 | 结果 |
|---|---|
| 点已播节目段 | 跳到该节目开始播放(回看按回看地址重新请求,时移在本次会话内跳转) |
| 点未来节目段 | 等同于节目单里的「预约」按钮,直接创建预约(提醒 / 自动播放) |
| 点刻度尺 | 跳到该时间点;不可回看/时移时忽略 |
| 拖动播放头 | 连续跳转;时移时被夹在缓冲区范围内,不会请求尚未录制到的时段 |
| 悬停时间轴 | 鼠标位置显示虚线游标与气泡(时间 + 节目名 + 提示) |
配套设置:设置 → 播放 → 进度条样式
EPG 时间轴(默认):上面这条带节目信息的进度条标准进度条:只显示一根进度条与已播/总时长,不显示节目名与刻度
频道没有节目单时,窗口底栏会自动改用标准进度条;全屏浮层首次进入即会显示时间轴。
2. 手机语音遥控(新)
手机页面上的麦克风按钮打开「语音控制」面板:
- 录音在手机上完成(16 kHz 单声道 PCM),分片上传给播放器
- 播放器用本机离线模型(SenseVoice-Small,int8 量化,约 228 MB,不联网)识别,音频与识别结果都不会离开本机
- 识别结果与候选频道会回显在面板里(例如听到「3 台」,面板列出
CCTV3) - 识别完成后面板保持打开,可以连续下达多条指令
支持的指令(不必说「小爱」之类的唤醒词,直接说即可):
| 说法 | 结果 |
|---|---|
湖南卫视 / CCTV3 / 3 台 |
按台名或频道号换台(同音字如「2 太 / 2 胎」也能识别) |
下一个台 / 上一个台 |
上下换台 |
换源 |
切换当前频道的下一个播放源 |
音量 40 / 音量加 / 静音 |
调整音量或静音 |
快进 30 秒 / 后退 15 秒 |
相对跳转(回看 / 时移中生效) |
回看今天的新闻联播 |
在当前频道的节目单里找到该节目并回看 |
现在在播什么 |
播报当前频道的节目信息 |
其它:
- 面板下方的输入框可以直接输入文字指令再点「发送」,效果与语音一致
- 首次使用需要在 设置 → Web 遥控器 → 离线语音 下载模型(带进度与失败重试),也可以在该页关闭离线语音
- 语音唤醒词、自定义短语规则、音量步进等可在同一页配置
- 手机麦克风只在安全上下文(
https://或localhost)下可用:以http://192.168.x.x打开时页面会提示当前不是安全上下文,语音面板无法录音——按《Web 遥控器》文档装好证书、改用https://打开即可
3. 回看 / 时移落点修复
| 问题 | 说明 |
|---|---|
| 全屏时间轴回看落点偏移 | 全屏浮层的放手回调只有「时移」与「直接 seek」两条分支,回看时把节目相对秒数交给了 SeekAbsolute,而 mpv 的时间轴是相对当前已加载流的起点,于是点了 15 分钟实际落到 节目起点 + 15 分钟 + 已累积推进量;现在窗口条与全屏浮层共用同一个换算方法,回看走「节目起点 + 相对秒数」、时移走「缓冲窗口起点 + 相对秒数」 |
| 时移可以拖到未录制的时段 | 时移量程此前只按节目边界设置,没有按缓冲区收敛;现在拖动会被夹在 TimeshiftMax 之内,不再对还没产生的时段发起请求(那种请求会取流失败甚至卡住) |
| 悬停游标不跟随鼠标 | 吸附到刻度的悬停逻辑没有任何生产调用方(只有测试在断言它),真实路径是像素 1:1 跟随;本版删除了这段死代码,并把测试改为断言实际的跟随行为 |
4. Web 遥控器修复与加固
| 问题 | 说明 |
|---|---|
| 台标带缓存参数必 404 | /logo/ 之前没有剥掉 ?v=... 查询串(/icons/ 剥了),而带缓存参数的台标请求正是页面常用的写法;现在与其它路由一致先剥参数再解码,并且 .neg(负缓存标记)不再被当成图片返回,改为 404 + 1 小时缓存 |
.ico / .bmp 类型错误 |
这两种扩展名在白名单里,但响应类型没有分支,落到了 application/octet-stream,浏览器不嗅探时会显示坏图;现在分别返回 image/x-icon 与 image/bmp |
| WebSocket 偶发请求无响应 | 消息处理是「发射后不管」+ 并发送出,同一连接上两次 SendAsync 会抛 There is already one outstanding 'SendAsync' call,异常被吞掉后该请求永远没有回包(页面只能等超时);现在每个连接一个发送门,发送串行化 |
| 语音诊断把「授权成功」记成故障 | 手机点「允许」会先上报 stage=mic, detail=granted,而诊断判定把 stage=mic 一律记为故障,于是每次正常授权都会写一条警告;现在只有 detail ≠ granted 才算故障 |
| 15 秒录音上限静默截断 | 页面在上限时上报的是 stage=record, detail=max,判定里查的却是 stage=max(永远为假),录音被截断却没有任何记录;现在能正确记录 |
| 请求头无上限 | 头部读取只用 \r\n\r\n 作为结束标记、不限长度,异常客户端可以让内存无界增长;现在超过 64 KiB 直接返回 431 Request Header Fields Too Large |
| 换 IP 后手机证书报错 | 服务器证书按当前网卡地址签发,但进程内只加载一次、且只在停止时失效,于是 DHCP 续租或换 Wi-Fi 后手机一直 ERR_CERT_COMMON_NAME_INVALID,必须重启程序;现在每次使用前都比对地址名单指纹,地址变了就用同一套根证书自动重签服务器证书(手机上已安装的 CA 无需重装) |
| 回看时间解析受系统文化影响 | 解析 start 用了不带区域信息的 DateTime.Parse,在非公历默认日历的文化(如泰历)下年份会被解析成佛历年份;现在固定 InvariantCulture |
5. HTTPS 与二维码
- 启动自检:SrcBox 启动时会用环回地址对自身做一次 TLS 握手自检,只有确认真的能提供 HTTPS,才在页面和二维码里给出
https://地址;如果当前环境用不了 HTTPS(例如程序被安全策略限制、证书目录不可写),页面与二维码会自动回落到http://,证书下载入口(/cert、/cert.pem、/cert.mobileconfig)仍然可用——不会再给手机一个永远打不开的https://入口。 - 证书续签:服务器证书写入当前网卡地址(SAN),换网后按新地址名单自动重签,根证书不变。
- 台标与语音日志:常规的语音诊断上报(例如授权成功、开始录音)从警告降为信息,日志里剩下的才是真问题。
6. 其它修复
| 问题 | 说明 |
|---|---|
| 换流后起播计时不准 | 播放计时器跨流复用:换台后新流的首帧等待被算进上一条流的时间,还会误报「起播慢」;现在检测到播放地址变化就重置计时与首帧标记 |
| 口述频道号识别不到 | 离线识别会把数字听成同音字(2 太/2 胎、舞、幺、洞);现在换台参数会先做同音归一,再说「2 台」也能换。另外「换到 2 台」这类带量词的整句不再被当成频道名 |
| 播放器被强杀后遥控器消失 | Web 遥控器监听套接字没有开地址复用,被强杀的实例留下 TIME_WAIT 后,新实例绑定失败并只写一行错误,遥控器彻底不可用;现在启用地址复用,强杀后立刻重启也能恢复 |
| 设置页离线语音提示重叠 | 「离线语音」提示文字写在了没有定义的行上,WPF 会把它塞进最后一行并压到其它控件;已补齐网格行 |
7. 文档与测试
- 四种语言(中文 / English / 繁體中文 / Русский)的《EPG》新增 EPG 时间轴(进度条):界面元素、各项操作、以及「EPG 时间轴 / 标准进度条」的切换,并配窗口底栏、全屏浮层与标准进度条三张截图。
- 四种语言的《Web 遥控器》新增 语音遥控(离线) 与 HTTPS 可用性与证书续签 两节:指令清单、离线模型、安全上下文要求,以及启动自检与自动重签的行为,并配语音控制面板截图。
- 自动化用例总数由 v1.1.16 的 246 提升到 461 通过 / 0 失败:新增用例覆盖台标请求解析与响应类型、语音诊断判定、语音指令解析(含同音字与量词)、时间轴指针换算与缓冲裁剪、播放计时重置、HTTPS 自检与证书指纹重签、以及 Web 遥控器端到端(同端口 HTTP/HTTPS、二维码、PWA)。
Known Issues
- 若 SrcBox 运行在受限完整性级别下(例如程序目录被安全策略或沙箱标记为 Low Integrity、进程被降权),它无法写入用户配置目录、也无法创建用户密钥容器,HTTPS 因此不可用;本版新增的自检只保证此时页面与二维码自动给出
http://,不会给出打不开的https://。这类限制来自运行环境,不是程序缺陷——把程序放在普通的用户目录下运行即可恢复 HTTPS。 - 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;面板内部配色已逐像素对齐,该差异仅出现在透明分层窗口边缘,本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段,早期更新日志中的相关条目与实现不符)。
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),沿用上一版的记录,本版未改动。
Download
SrcBox v1.1.16
v1.1.16 Release Notes
Release Date: 2026-10-13
Previous Version: v1.1.15
Highlights
本版集中修复回看(回放)与时移链路,并补上 rtp2httpd 的 catchup-source 兼容:
- 回看/时移黑屏修复(#44):纯参数段的
catchup-source(形如?playseek=…)此前被原样交给播放器,播放器收到的是一个没有主机名的裸参数段,于是画面全黑、日志却显示"视频已显示"。 - rtp2httpd 免配置回看:识别 rtp2httpd 地址(默认 5140 端口或
/rtsp/路径),频道即使没有任何catchup-*标签也能回看/时移。 - 时间覆盖不再破坏 playseek:布局为
start_end/start_duration/auto时不再把playseek删改成starttime/endtime(rtp2httpd 不认后者,会静默回落到直播)。 - 界面修复:设置页 rtp2httpd 时区 卡片的提示文字不再与复选框重叠;标题栏的更新红点重启后仍会保持,且只显示红点、不再附带下拉箭头。
1. 回看 / 时移修复(#44)
| 问题 | 说明 |
|---|---|
纯参数段 catchup-source |
catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" 这类写法以前直接返回参数段本身,mpv 收到 ?playseek=…(无 http://主机)必然黑屏;现在按已带 ? / 未带 ? 自动选择 & / ? 拼接到该频道的直播地址 |
catchup="append" |
显式声明追加语义,允许 catchup-source 只写一段裸参数(不带 ?) |
| 拼接地址与播放地址不一致 | 拼接前先按播放路径统一清洗:去掉 $quality 之类后缀、对非 ASCII 路径做百分号编码,避免"拼出来的地址"和"实际播放的地址"不是同一个 |
| 日志误导 | 切到视频区域时的日志不再写成"视频画面已显示",避免"日志正常、画面全黑"无从判断 |
回看/时移的地址解析规则已抽成独立模块并配回归测试,覆盖 catchup-source、catchup="append"、回放模板、时移模板与 rtp2httpd 兜底五条路径。
2. rtp2httpd 兼容(stackia/rtp2httpd)
rtp2httpd 的回看/时移是在同一个直播地址上带 playseek=开始-结束,本版据此补齐:
| 场景 | 行为 |
|---|---|
频道自带 catchup-source(参数段或完整 URL) |
参数段拼到直播地址;完整 URL 原样使用,${utc:…} / {utc:YmdHMS} / {utcend:YmdHMS} 占位符正常展开(rtp2httpd 导出的 M3U 就是这种写法) |
频道没有任何 catchup-* 标签 |
自动为 rtp2httpd 地址生成 playseek=开始-结束 请求,无需逐频道配置 |
| 时间基准 | 未开启「rtp2httpd 时区标记」时按 UTC 表达(rtp2httpd 的默认语义);开启后会随请求带上 TZ/UTC+N 标记,此时直接发本地时间 |
| 时移 | 进入时移、以及时移中按 ←/→,都是换时间段重发同一地址上的 playseek 请求,不是让 mpv 做相对 seek |
udpxy(/rtp/、/udp/) |
故意不自动生成 playseek:这类服务端会忽略该参数并静默播直播,必须显式配置 catchup-source |
3. 「时间覆盖」不再破坏 playseek
- 此前:设置页打开"时间覆盖"、布局为
start_end/start_duration/auto时,重写器会先删除地址中的playseek,再写入starttime/endtime;rtp2httpd 不认识后者,于是点了回看却播放直播。 - 现在:地址里已经带
playseek/tvdr的回看请求只有playseek布局才会重写,其它布局一律保持原样;没有时间参数、也没有playseek/tvdr的地址仍按配置注入时间(原有能力保留)。
4. 界面修复
| 问题 | 说明 |
|---|---|
| 设置页文字重叠 | 「设置 → rtp2httpd 时区」卡片只定义了 5 行网格,提示文字却写在第 6 行;WPF 对越界的 Grid.Row 不报错,而是把元素塞进最后一行,于是一段说明文字被画在「允许无效/自签名证书」复选框上,看起来像文字挤压。已补齐行定义,两者各占一行 |
| 更新红点不出现 | 后台检查此前只在「距上次检查 ≥ 24 小时」时才运行,而"有更新"的状态只存在于内存中:发布晚于上次检查、或重启程序之后都看不到红点。现在检查时机为「从未检查 / 应用版本与上次不同 / 距上次 ≥ 24 小时」,已发现的新版本会跨重启保留,只有真正拿到版本信息才记录节流时间(网络失败下次启动会重试),更新到该版本后红点自动熄灭 |
| 红点后的下拉箭头 | 更新红点按钮此前复用了标题按钮的样式,跟着渲染出一个下拉箭头;现在只显示红点,窗口标题栏与全屏顶部浮层一致 |
5. 文档与测试
- 四种语言(中文 / English / 繁體中文 / Русский)的《回看与时移》指南补充:纯参数段
catchup-source的拼接规则、catchup="append"、rtp2httpd 免配置回看与时间基准、以及"带playseek/tvdr的请求只被 playseek 布局重写"的例外说明。 - 自动化用例总数由 v1.1.15 的 217 提升到 246 通过 / 0 失败:新增用例覆盖地址构建(参数段
catchup-source、catchup="append"、完整 URL、模板优先级、rtp2httpd 兜底)、"时间覆盖"各布局的取舍、更新红点的触发时机与跨会话恢复,以及直接走真实回看/时移入口并断言最终交给mpv的 URL 的端到端用例。
Known Issues
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;面板内部配色已逐像素对齐,该差异仅出现在透明分层窗口边缘,本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段,早期更新日志中的相关条目与实现不符)。
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),沿用上一版的记录,本版未改动。
- 仍有部分
catch { }未记录上下文。
Contributors
感谢以下用户的贡献:
- @zj2201646604 - 报告回看/时移无法播放,并提供 rtp2httpd 转发链路与调试日志 (#44)
Download
SrcBox v1.1.15
v1.1.15 Release Notes
Release Date: 2026-10-11
Previous Version: v1.1.14
Highlights
本版是 v1.1.14 之后的全部更新汇总,主要有四块:
- 全屏重构:不再创建独立的全屏窗口,改为主窗口自身进入全屏,所有浮层(顶栏、底栏、EPG、频道列表)都归属主窗口,全屏下的几何、配色与退出恢复一并修正。
- 手机遥控免装 App:同一个端口同时提供 HTTP 与 HTTPS,内置自签证书可直接下载安装,遥控器可作为 PWA 安装到手机主屏幕,全屏打开与原生应用无异。
- 加载体验:EPG 改为渐进加载,节目单不再等全部源解析完才出现。
- 记忆能力:按 M3U 源记住最后播放的频道、按频道记住上次选择的源,并可在设置里关闭。
1. 全屏重构
| 变更 | 说明 |
|---|---|
| 主窗口自身全屏 | 去掉独立的 FullscreenWindow,全屏由主窗口进入;浮层窗口的 Owner 指向主窗口,层级与生命周期统一 |
| 退出恢复 | 退出全屏后恢复进入前的窗口几何(含"全屏中直接退出程序"),标题栏按钮保持隐藏,多屏窗口样式还原 |
| 静态标题栏 | 全屏下不再残留静态标题栏(此前靠主窗口 Hide() 掩盖,单窗口化后暴露成"全屏出现两个顶栏") |
| 浮窗尺寸 | 全屏下的 EPG 与频道列表浮窗改为占可用高度 72% 并上下居中,左右各留 16px;面板内容宽度仍为 320 / 380 |
| 深浅色一致 | 浅色主题进入全屏后,顶栏、底栏、EPG 浮窗、频道列表浮窗统一改用深色配色,与深色全屏完全一致;退出全屏立即恢复浅色,窗口模式不受影响 |
| 音量 | 默认音量改为单位增益 1.0,最大音量设置可把输出提升到 1.0 以上 |
2. Web 远程控制(手机遥控)
界面与交互
- 遥控器页面重新设计(拟物 Neumorphism 风格),新增标准遥控盘:方向键、数字键、音量键、换源/静音、全屏,并在页面右上角一键切换到完整界面,选择记录在浏览器本地
- 快捷控制区恢复时移开关(对应
setTimeshift),按钮样式与文案跟随播放器回传的status.timeshiftEnabled同步 - 节目单的回看按钮改为按频道能力显示:只有节目已播出、且该频道带
catchup-source或时移 url 时才出现,不再依赖全局时移开关 - 频道按播放列表的分组顺序连续编号(不随分组重置),标准遥控盘可直接输入频道编号换台
- 从手机换台时,电视端会显示频道号角标,与遥控器输入的数字对应
- 四种语言的页面文案全部补齐(中文 / English / 繁體中文 / Русский)
HTTPS 与证书
| 能力 | 说明 |
|---|---|
| 单端口双协议 | 同一个端口既接受 http:// 也接受 https://;服务端窥探首个字节(0x16 = TLS 握手)决定是否套用 TLS,无需再配置第二个端口 |
| 自动自签证书 | 首次启用时自动生成根证书与服务器证书,存放于 %LOCALAPPDATA%\SrcBox\webremote-certs;根证书有效期 10 年,服务器证书 397 天并在到期前 30 天自动续签 |
| 证书下载 | /cert(DER,srcbox-ca.crt)、/cert.pem(srcbox-ca.pem,兼容拒绝 DER 的部分 Android)、/cert.mobileconfig(iOS 描述文件,一键安装) |
| 设置页证书面板 | 新增证书安装地址、证书状态与到期日、重新生成证书按钮;二维码直接指向 HTTPS 地址(证书不可用时才回退 HTTP) |
Android 安装路径:「设置 → 安全 → 加密与凭据 → 安装证书 → CA 证书」;iPhone 安装描述文件后还需在「设置 → 通用 → 关于本机 → 证书信任设置」开启完全信任。
安装到手机主屏幕(PWA)
- 页面提供
manifest.json、Service Worker(srcbox-remote-v6)、应用图标与apple-touch-icon,支持 Chrome/Edge「安装应用」与 iOS Safari「添加到主屏幕」 - 页面内新增安装按钮与全屏按钮(⛶):安全上下文下走浏览器原生安装流程,iOS 给出分享说明,纯 http 下提示先装证书并提供「用 HTTPS 打开」一键跳转
- 不装证书也可用浏览器菜单「添加到主屏幕」,再点页面右上角全屏按钮,同样没有地址栏
3. 记忆能力与设置
| 能力 | 说明 |
|---|---|
| 每个 M3U 源记住最后频道 | 切换回某个已保存的源时,自动恢复到离开时播放的频道 |
| 每个频道记住上次的源 | 同一频道有多个源(多线路)时,下次播放沿用上次选中的线路 |
| 记忆开关 | 播放设置中新增开关,可关闭上述记忆行为 |
| 最大音量 | 最大音量设置可把输出提升到单位增益以上(此前被 1.0 封顶) |
| 遥控器显示项 | 「显示频道列表 / 显示节目单」开关真正生效(此前保存了但远程页面从不读取);新增节目单条数上限(5–500,默认 50)设置项 |
4. EPG
- 全屏打开 EPG 面板时正确加载节目单(此前需要先回窗口模式)
- 渐进加载:节目单不再等全部源下载解析完毕才出现——加载期间显示本地化的「加载中」提示,每个源解析完成后立即合并发布,先到的源先显示,全部完成后替换为完整节目单;切换源时清理智能匹配缓存,避免旧数据串台
5. 其它改进与修复
- 新增新版本角标(顶栏显示可更新提示),移除「关于」入口,更新入口统一到设置
- 修复
Channel.HealthColorBrush(计算型 WPF 画刷属性)进入 JSON 序列化导致M3UCacheService缓存静默失败的问题(该属性标记为不序列化) - 文档站:新增极光(aurora)动效主题;新增 UI 改造提案文档
- 文档:四份
web-remote指南补齐 HTTPS / 证书 / PWA 安装章节,并更新遥控器截图 - 四种语言的 FAQ、功能介绍、简介、指南索引与路线图页面同步补充 HTTPS 与 PWA 说明,并清理英文站 / 俄文站遗留的中文片段
- 修正文档中与实现不符的多处描述(不存在的 WebSocket 动作
prevChannel/nextChannel、不存在的"倍速"按钮、Badge 颜色、源健康状态、以及"默认仅允许 localhost 访问"的错误说明——实际监听所有网卡),并把时移开关补回文档
界面截图
| 标准遥控 · 深色 | 标准遥控 · 浅色 |
|---|---|
![]() |
![]() |
| 完整界面 · 深色 | 完整界面 · 浅色 |
![]() |
![]() |
Localization
- 四种语言各新增 7 个 key(
EPG_Loading、5 个 WebRemote 证书相关文案、UI_WebRemote_MaxEpgItems)、修改 4 个 key(远程控制启用项、端口、访问提示、扫码提示),保持四语言 key 集合完全一致。 - 遥控器页面自身的内嵌文案(含证书安装步骤、PWA 安装说明)亦为四语言。
Known Issues
- 浅色主题下全屏 EPG 浮窗的最外圈存在 1 个设备像素的浅灰边(约
#AAAAAA),深色主题下为#707070;面板内部配色已逐像素对齐,该差异仅出现在透明分层窗口边缘,本版未处理。 - 远程页面不显示播放源健康状态(数据模型中没有该字段,早期更新日志中的相关条目与实现不符)。
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),沿用上一版的记录,本版未改动。
- 仍有部分
catch { }未记录上下文。
Download
SrcBox v1.1.14
v1.1.14 Release Notes
Release Date: 2026-10-03
Previous Version: v1.1.13
Highlights
本版是一次质量与安全补丁:基于对全仓代码的完整审查(224 个 C# 文件 / 3.4 万行),修复了 20+ 个确定影响功能的问题,并完成本地化与安全加固。回看/时移、设置持久化、录制、上传、菜单与多语言行为均有改动,详见下文。
Bug Fixes
| 问题 | 修复 |
|---|---|
| 设置页填写的第 2 个及以后 EPG 地址保存后消失(#38 多 EPG 无法维护) | 表单复制与保存回写统一走 EpgConfig.CopyFrom,附加 EPG 列表不再丢失 |
| 上传队列「重试」按钮无效 | 重试会重置尝试次数并真正重启上传消费者,不再需要重启程序 |
| 主动停止后台录制被标记为「失败」并弹失败通知 | 新增结果判定:用户停止保持 Stopped/Cancelled,只有真实错误才算 Failed |
系统代理为 http=host:port;https=... 形式时被忽略(源/EPG/台标全部直连失败) |
重写代理解析(原判定条件恒假),支持逐协议写法 |
设置保存中途崩溃导致 user_settings.json 损坏、全套配置静默回默认 |
改为临时文件 + 原子替换(保留 .bak),失败记 Error;损坏文件备份为 .broken 并记录日志 |
旧版配置里的 CustomEpgUrl/CustomLogoUrl/TimeshiftHours 升级后失效 |
加载时自动迁移(新的嵌套配置优先) |
| 设置窗口开着时从菜单改编码器,再保存会把改动回滚 | 复用设置窗口前重新载入全部表单字段 |
| 构建设置对象异常时用「默认设置」覆盖并落盘 | 异常时取消保存并提示,不再覆盖用户配置 |
| 全屏切换失败留下"主窗口隐藏、全屏未显示"的不可见状态(甚至异常穿透崩溃) | 进入失败即回滚,覆盖层步骤失败只记日志;退出路径在 finally 中保证主窗口恢复 |
| 退出时 mpv 已释放但未置空,定时器/回调仍可能打到空句柄 | 退出先停全部定时器、解除引擎引用、Dispose 并置空;录制与多屏窗口定时器补齐释放 |
| 顶栏标题菜单与主菜单音量项可点击但无响应 | 回调为空的菜单项自动禁用;主菜单音量 ± 接到现有快捷键动作 |
| mpv 属性名不存在导致功能静默失效 | 经随包 DLL 校验后修正:record-file→stream-record(录制回退真正可用)、源超时→network-timeout、HLS 直播边缘→demuxer-readahead-secs;移除无效的 RTP/音频下混属性 |
RTSP 认证从未生效(mpv 无 rtsp-user/rtsp-password 属性) |
凭据改为注入播放地址(rtsp://user:pass@host/...) |
| >2GB 录像不显示时长 | 时长估算改为 long 运算,不再溢出 |
| WebDAV 建目录失败仍报成功,后续上传报无关错误 | MKCOL 真实失败时返回失败并记日志 |
| 回看/时移的「追加 epg_time」开关状态显示错误且不保存 | 表单复制与保存回写补齐该字段 |
| 代理失败后的"直连兜底"只生效一次 | 不再释放共享 handler(disposeHandler: false),兜底始终可用 |
| 精简模式退出后悬浮工具条残留、多屏窗口关闭后定时器不停 | 关闭/退出路径补齐定时器与控件释放 |
| 打开菜单越用越慢(菜单项列表只增不减) | 见「已知问题」,本版未改动 |
Localization
- 四种语言现在各定义 655 个 key,完全一致:
- 补齐了此前四语言全缺导致界面空白的 key(
Overlay_Speed、Drawer_Recordings_Upload实为拼写错误,已改为已有 key;Common_Minimize/Common_Maximize新增)。 - 补齐 35 个只在代码里以中文兜底出现的 key(toast、录制状态、删除确认、预约状态等),现在英文/繁体/俄文都能正确显示。
- 补齐各语言缺失的 13 个 key(
Msg_ConfirmExit、EPG_Status_*、更新进度与 CDN 等)。
- 补齐了此前四语言全缺导致界面空白的 key(
- 新增单元测试:四语言 key 集合必须一致,且代码/XAML 引用的文本 key 必须存在(防止再次漂移)。
Security
- HTTPS 证书默认校验:共享 HttpClient 原先接受任意证书(中间人可替换源/EPG/台标并读取其中凭据)。现在默认严格校验;如你的源使用自签名证书,请在「设置 → HTTP/RTSP」勾选新增的允许无效/自签名证书(改动后自动重建客户端,无需重启)。
- WebRemote
/logo/端点收窄:原先可读取本机任意文件,现在只允许台标缓存目录或程序目录下的图片文件,其余返回 403。 - 日志脱敏:认证失败日志不再写入明文口令;
LogRedactor新增password=/pwd:/JSON 键值/token=形态的掩码。 - 下载与并发上限:M3U/EPG 下载改为流式并限制 64MB(含解压后,防 gzip 炸弹);台标预热并发限制为 8。
Behavior Changes
- 自签名/无效证书的 https 源需要在设置里显式放行(见上)。
/logo/仅服务图片文件(WebRemote 显示台标不受影响)。- 设置目录会新增
user_settings.json.bak(上一份)与user_settings.json.broken(仅在文件损坏时)。 - 提醒的台标解析改为非阻塞(本地缓存命中则显示,否则后台预热,下次生效),不再有卡死风险。
Known Issues
- 菜单构建仍会累积内部菜单项引用(长时间运行后菜单刷新略慢),已在审查中记录,本版未改动。
- 仍有大量
catch { }未记录上下文(本版补了最影响排障的几处)。 - 播放侧的
tls-verify保持原样(仅流播放),HTTP 下载侧才走严格校验。



