Skip to content

Releases

QuickLook · 看片版 4.5.0 —— 长按快进不再卡死,全屏真正铺满

Choose a tag to compare

@Binbin-miao Binbin-miao released this 05 Nov 10:22

QuickLook · 看片版 4.5.0(长按快进不再卡死 / 全屏真正铺满)

长按方向键快进:画面会彻底定格,松手也不恢复

这个问题很邪门——同样的片子,有时候一路顺滑,有时候按住两秒画面就死在那里,
进度条不动、松手不动,只能关掉重开。现在查清楚也修掉了。

实测(按住 1.5 秒,每 33 毫秒一次 +5 秒)

素材 修之前 修之后
243MB,关键帧间隔 53 帧(长 GOP) 松手后 0 帧输出,画面永久定格 松手 26 帧,按住期间出帧 60 → 208
2560x1600 + 超分到 4K 按住 1.5 秒只出 1 帧,只走了 10% 走到 100%,出帧 56
533MB / 179 秒 按住出帧 202 按住出帧 765

三个原因叠在一起

  1. 每按一次键就去重新定位解码器,而重新定位是 100 毫秒级的活。按住时一秒按 30 次,
    解码器永远在重新定位,一帧都出不来。
  2. 「丢掉定位前的旧帧」这个门槛只在「追上目标」时才解除。一旦片子读到视频轨末尾
    (很多录制文件的视频比音频短),帧不再来了,门槛却还指着未来某个时间点,
    于是所有帧都被丢掉,而且没有任何东西会再叫醒它——这就是定格。
  3. 每次按键都拿「当前播放到哪」加 5 秒,可那个值在定位完成前根本不动,
    于是按住半天只前进 5 秒。现在改成累加「你上一下要跳到哪」。

顺带修的:定位失败时以前会把异常吞掉却照旧设门槛(定格就是这么来的),
现在会先把解码器冲一遍重试一次,还失败就把状态收干净。

按住时临时不超分:4K 输出每帧要几十毫秒,按住时跟不上。
按住期间跳过超分、松手 260 毫秒自动恢复;暂停时按方向键不会跳过
(那一帧你要看清,不能留一张糊的)。

24.9 天之后才发作的隐患也一并修了:计时用的 Environment.TickCount 是 32 位,
开机超过 24.9 天会回绕成负数,那之后 seek 的节流判断永远不成立,seek 会被一直吞掉,
而且日志里什么都看不到。现在换成单调时钟。

全屏:四周那一圈 1px 黑边

进全屏时窗口样式去掉、边框厚度没去掉。WPF 窗口默认有 1px 边框,它占的是客户区外的空间:
窗口 1920 宽,视频面板只拿到 1918,引擎按这个算输出、再被布局取整收成 1916,
于是 1920x1080 的屏幕上四周各留 1px。

修完实测:target 1916x1078 → 1920x1080,画面真正贴到屏幕边缘。

合并了上游 8 个提交

其中对我们有影响的是旋转角度的解析:90.000 在德语/俄语区域设置下会被解析成 90000 或 0,
上游改成按固定区域解析,我们直接采用。其余是文本预览、SVG 缩放、应用图标、MSI 图标。

测试工具也修了两处(它们一直在掩盖问题)

  • regress.sh 里写死的测试片被清理掉了,之后每次回归都报「Open 失败」,
    实际上是「什么都没测」。现在会自动挑一个存在的素材。
  • 倍速回路把期望帧率写死成 25fps,换一部 60fps 的片子就必然误报。现在以首次实测为基准。

安装

  • 绿色版:解压覆盖,先退出托盘里的 QuickLook。
  • 安装版:先卸载旧版再装这个(MSI 产品版本号没变,同版本不会覆盖文件)。

版本号里的 g30364df 是构建这个包时的提交。

验证过的

vsr / algo / storm / rate / nosupport 五条引擎回路 + 子进程回路 + UI 宿主真实菜单点击,
全部 GREEN,0 次卡顿、0 条错误。长按回路单独跑了两轮(进程内 / 子进程),都达标。

QuickLook · 看片版 4.5.0 —— 只重启内核,主程序不退出

Choose a tag to compare

@Binbin-miao Binbin-miao released this 23 Oct 23:37

QuickLook · 看片版 4.5.0(只重启内核,主程序不退出)

上一版(custom.3)修掉了「显存越用越多」,但用的办法是到期重启整个 QuickLook。
这个版本把病根拔了:解码和超分搬到独立进程,回收 = 关掉那个进程,主程序全程不退出。

上一版留下的两个打扰,没了

  • QuickLook 每次重启都会弹一条「QuickLook 正在后台运行」的通知;
  • 游戏++ 把 QuickLook.exe 当成游戏在监控,进程一退就弹一份性能报告。

现在主程序的 PID 从头到尾不变,这两个都不会再出现。

实测(真机,连开关 4 部片)

主程序 pid 19824 → 19824(全程没变)      线程 26 → 27~30
引擎子进程 14528:预览时存在,关掉预览 30 秒后自动退出
显存 1854MB → 1655MB(资源真的还回去了)

对比上一版:主程序每开一部片多留 55 个线程 + 250MB 显存,只能靠重启回收。

它是怎么工作的

QuickLook.exe                    只看不管:面板、托盘、D3DImage
  └─ VideoEngineProxy ──命名管道──┐  命令:打开 / seek / 暂停 / 倍速 / 音量 / 换档
                                   │
QuickLook.VideoEngineHost.exe ←────┘  画面:共享显存,零拷贝,像素不进内存
  └─ D3D11 设备 + MF 硬解 + RTX VSR + 缩放 + 音频 + 时间轴

这个版本顺手修掉的东西

  • seek 泄漏:预卷丢帧那条分支直接 return,注释写着「tex 由 using 释放」但 using 在后面,
    每丢一帧漏一张整帧纹理(长 GOP 片子 seek 一次能漏几十张)。
  • 每帧新建解码纹理 → 按尺寸复用,25~60fps 下每秒几十次整帧分配没有了。
  • 缩放着色器每预览编译两遍 → 进程内只编译一次。
  • 音频回调句柄泄漏:VoiceNotify 没有 Dispose,GCHandle 一直挂着。
  • 自重启抢单实例锁:新进程会在旧进程还没退出时弹「另一个 QuickLook 进程正在运行」。

已知情况

  • 引擎子进程是 x64 的,ARM64 版暂时只能走进程内引擎。
  • 首次预览多约 1 秒(拉起子进程 + 建设备 + 初始化 NGX),之后是热启动。
  • 排障开关 IsolatedEngine:设成 false 退回「引擎跑在 QuickLook 进程内」的老跑法,
    代价是显存/内存不再归还。改法见 README。

安装

  • 绿色版:解压覆盖,先退出托盘里的 QuickLook。
  • 安装版:先卸载旧版再装这个(MSI 的产品版本号没变,同版本不会覆盖文件)。

版本号里的 g89ec046 是构建这个包时的提交。

验证过的

vsr / algo / storm / rate / nosupport 五条引擎回路 + 子进程回路 + UI 宿主 14 次真实菜单点击
(倍速、VSR 三档上限、质量、三种缩放算法、H/W ↔ S/W 切换)全部通过,0 次卡顿、0 条错误。

QuickLook · 看片版 4.5.0 —— 显存不再累积

Choose a tag to compare

@Binbin-miao Binbin-miao released this 23 Oct 21:04

QuickLook · 看片版 4.5.0(显存不再累积)

这个版本只修一件事:长时间不关 QuickLook,显存会被吃光。

现象

连续预览十几个视频之后,12 GB 的卡能占掉 9 GB 以上,别的程序开始掉帧。
现场抓到的一次:进程开了 20 小时、预览过 23 个片子,稳稳占住 9.2 GB 显存,
关掉预览也不还,只有杀进程才清。每预览一次固定 +55 个线程、+250 MB 显存。

排查

能想到的都试过了,全部无效:

怀疑点 验证 结果
渲染线程没退出 Join 计时 0–1 ms,正常退出
释放时抛异常 逐项 try/catch + 日志 0 条失败
托管对象没回收 强制 GC + 终结器排空 无效
MF 平台没关 补 MediaManager.Shutdown 1 ms 返回,无效
WPF 还捏着表面 先解绑 D3DImage 再释放引擎 无效

结论:对象确实释放了,但底层原生资源(D3D11 设备上下文、解码器、共享表面)
被进程级缓存攥着,只有进程退出才还。这是驱动 / MF 的行为,改调用顺序救不回来。

这次怎么修的

  • 预览关闭后自动回收:空闲 4 秒且线程数 ≥ 700 时,静默重启一次 QuickLook,
    把资源一次性还回去。连续翻片不会被打断(4 秒内有新预览就跳过);
    硬上限 1200 线程,连翻二十多部时关掉预览立刻重启。
  • 释放加固:每个资源单独 try/catch(一个抛异常不再拖垮后面十几个);
    先解绑 D3DImage 再释放引擎;补上对称的 MF shutdown;
    把 Join 结果和线程数写进日志,下次排障直接从数据开始。

实测

阶段 线程 显存
空载 27 1.6 GB
连预览 14 部 1144 7.5 GB
停手 25 秒 24(进程已自动重启) 2.0 GB

重启之后预览照常:VSR=on、25 fps、无报错。

你会注意到的变化

托盘图标偶尔会闪一下(自动重启),1–2 秒后恢复,下一次预览多等约 1 秒预热。
正在预览时不会触发。

还没做的

设备复用(全程只用一台显卡设备、不再反复新建/销毁)才是根治,但要动引擎核心
并重测所有播放路径,留到下个版本。

安装

  1. 下载 QuickLook-4.5.0-10-g1249d86.msi
  2. 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
  3. 未签名,SmartScreen 提示时选择「仍要运行」

便携版:解压 QuickLook-4.5.0-10-g1249d86.zip,运行其中的 QuickLook.exe。

版本号里的 g1249d86 是构建这个包时的提交。

QuickLook · 看片版 4.5.0 —— RTX VSR 超分 + 键盘操作

Choose a tag to compare

@Binbin-miao Binbin-miao released this 22 Oct 23:55

QuickLook · 看片版 4.5.0(RTX VSR)

在上一版「方向键 + 自动聚焦」的基础上,把视频预览的整条渲染链路换掉了。

新渲染内核

MF/DXVA 解码 → D3D11 → BGRA → NGX VSR 超分 → D3D9Ex 共享表面 → WPF D3DImage

音频走独立的 SourceReader + XAudio2,按音频时钟节流,变速不变调(WSOLA)。

S/W · H/W 现在真的决定路径

档位 播放路径 VSR
H/W(默认) 新引擎:D3D11 + DXVA 硬解 可用
S/W 原播放器:WPFMediaKit + LAV 软解,不创建任何 D3D 对象 不可用

显卡跑不了 VSR(AMD / GTX 10 系 / 驱动过旧)时,H/W 会自动退回原播放器 + LAV 硬解,
播放本身不受影响,也不会弹错误框。运行中切换档位会带着播放位置和播放状态切过去。

超分辨率菜单

输出高度的上限:1K(1080) / 2K(1440) / 4K(2160)。
实际倍率由引擎按源高度和窗口尺寸换算,不超过上限,也不超过 NGX 规格的 4×。
预览窗口从小拉大时会按当前挡位重新算倍率,缩回 1:1 以下自动关掉,不用重开文件。

实测(848×478 源,同一帧,只改挡位)

边缘能量 = 相邻像素亮度差的平均值,越高越锐:

挡位 驱动双线性 Spline36 VSR VSR / 双线性
1K · 1920×1080 3.089 3.871 4.296 +39%
2K · 2560×1440 2.360 2.941 3.323 +41%
4K · 3840×2160 1.592 1.978 2.159 +36%

VSR 不只是比双线性锐,也稳定高于 Spline36(+9% ~ +13%),说明确实在重建细节而不是插值。

细节对比图(左 → 右:驱动双线性 / Spline36 / VSR,点开看原始尺寸):

1K
2K
4K

安装

  1. 下载 QuickLook-4.5.0-8-g19ba592.msi
  2. 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
  3. 未签名,SmartScreen 提示时选择「仍要运行」

便携版:解压 QuickLook-4.5.0-8-g19ba592.zip,运行其中的 QuickLook.exe。

VSR 组件 nvngx_vsr.dll(NVIDIA RTX Video SDK)与 VsrBridge.dll 已随包分发。
版本号里的 g19ba592 是构建这个包时的提交(之后 master 上的文档改动不影响源码)。

QuickLook 自定义版 4.5.0 —— 视频方向键 + 自动聚焦

Choose a tag to compare

@Binbin-miao Binbin-miao released this 22 Oct 16:49

QuickLook 自定义版 · 视频键盘操作(4.5.0)

基于官方 master @ 2ec219a,仅改动 4 个文件(+169 / −4),其余插件零改动。

新增

  • ← / → — 快退 / 快进 5 秒
  • ↑ / ↓ — 音量 −5% / +5%
  • 空格打开视频后,键盘焦点直接落在视频上 —— 不用再点一下窗口,方向键立刻可用
  • ESC 关闭后焦点自动回到资源管理器,方向键恢复「选择文件」

变化

  • 单击不再播放 / 暂停(按需求移除);按住拖动移动窗口保留
  • 顺带修掉「窗口最大化时点击崩溃」的 DragMove 异常

仅视频生效

音频(mp3 / flac)、图片、PDF、Office 等其他预览类型的行为与官方版完全一致。

安装

  1. 下载 QuickLook-4.5.0-3-g9e4ad85.msi
  2. 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
  3. 未签名,SmartScreen 提示时选择「仍要运行」

便携版:解压 QuickLook-4.5.0-3-g9e4ad85.zip,运行其中的 QuickLook.exe。

版本号里的 g9e4ad85 是 rebase 之前的提交哈希,对应本仓库源码 d84f26f,代码内容完全一致。