Skip to content

SrcBox v1.1.17

Choose a tag to compare

@github-actions github-actions released this 13 Oct 19:21
· 23 commits to main since this release

v1.1.17 Release Notes

Release Date: 2026-10-14
Previous Version: v1.1.16


Highlights

本版带来两个新能力——桌面 EPG 时间轴进度条与手机语音遥控(本机离线识别),并修掉一批回看/时移、台标与 Web 遥控器的缺陷:

  1. EPG 时间轴:窗口底栏与全屏浮层的进度条改造成带节目名、刻度与状态角标的节目时间轴,可点节目跳转、按段翻页、点未来节目直接预约,也能一键切回标准进度条。
  2. 手机语音遥控:在手机网页上按住麦克风说话,录音上传到播放器后用本地离线模型识别;可以说频道名、频道号,也可以说 下一个台、换源、音量 40、静音、快进 30 秒、回看今天的新闻联播、现在在播什么。
  3. 回看/时移落点修复:全屏时间轴在回看时把「节目相对秒数」当成绝对时间直接 seek,落点会偏移(偏差恰为已累积的播放推进量);现在统一换算成绝对时间,时移拖动也会被限制在当前缓冲窗口内。
  4. 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