【免费下载链接】plx-native
Fast, unofficial Plex client for LG webOS TVs — native 60 fps UI, 4K HEVC/Dolby Vision, no Chromium or WebView.
PlxNative 是一款面向 LG webOS 电视的极速开源 Plex 客户端,它不依赖 Chromium 或 WebView,直接把界面画在 GPU 上以 60 fps 运行,视频交给电视自己的解码器。而它最让字幕党心动的一点是:在 Direct Play 播放时,ASS/SSA 样式字幕由应用原生渲染——卡拉OK 扫色、文字定位、重叠对白、动画特效和嵌入字体全部完整保留,而不是被降级成一行白底黑字,更不会丢给服务器烧录糊在画面里。
为什么电视端的 ASS 字幕渲染这么难
传统电视上的 Plex 客户端本质是网页应用,字幕能力受限于浏览器栈。PlxNative 直接删掉了浏览器:UI 全部用 Rust 绘制,字幕则由应用自带的 libass 渲染器处理。这意味着样式脚本不再被"翻译"成纯文本,而是按制作者的原始设计逐帧绘制:
- 样式与定位:
[V4+ Styles]中的字体、描边、阴影、对齐({\an}上中下九宫格)原样生效; - 重叠对白:多条签板(sign)同时出现时按 Layer 分层叠加,互不遮挡错乱;
- 动画与特效:
\move移动、\fad淡入淡出、\t变换等时序特效逐帧跟随字幕时钟; - 卡拉OK:
\k\K\kf\ko标签被播放器显式识别为"动画事件",活动期间逐帧重绘、结束后立刻停止——主色扫过音符的效果完整呈现,且平时零开销(见 ass_timing.rs 中的标签检测逻辑)。
嵌入字体与多语言兜底:再"任性"的字幕组也不怕
字幕组最爱把定制字体塞进视频里,PlxNative 的处理路径有三层保障:
- 视频内嵌字体附件:demuxer 会从 MKV 中完整提取 ASS 头、定时包和字体附件,交给 libass 使用。即使字体是在外部字幕文件之后才到达,也会被合并进去;总预算上限 32 MiB,超出的字体跳过而不拒绝整条轨道(逻辑见 ass.rs 的字体预算部分)。
- 突破 libass 的 10 个字体面限制:上游 libass 每个字体族默认只认 10 个 face,PlxNative 在构建时用补丁 libass-0001-grow-font-faces.patch 放宽了这一限制,并按摘要固定版本,保证渲染结果可复现。
- 缺失字体的优雅兜底:字幕里写了一个电视上没有的字体(比如 "Inter")时,不会打出方框豆腐。应用把 Inter 正文/粗体加上 22 个 Noto 多文种 Bold 字体面(manifest.json)按固定顺序注册,每个 Noto 字体都响应 "PlxSubs"/"Inter" 族名,未知字体名会落到覆盖该文字系统的那个面,而不是 CJK 默认面的缺字方框。阿拉伯语、泰语、天城文、希伯来语等书写系统都有专门字体。
另外,libass 被配置为启用Unicode 换行(依赖 libunibreak),所以中文、日文这种没有空格的字幕也能在合法断行点自动折行,不会硬撑出屏幕。
外部 ASS / SRT / VTT:同一条 libass 渲染管线
侧边挂载(sidecar)字幕走的是同一条管线,行为对新手很友好:
- 外部 ASS/SSA 文件按 UTF-8 原样整份加载,保留原始脚本与全部样式,切换轨道、倒回播放都不会重新下载;
- SRT、WebVTT 等文本轨道(无论内嵌还是外挂)由播放器合成一个 ASS 头部后交给同一个 libass worker:斜体、粗体、下划线、颜色、
{\an}定位都能识别,其余标记按纯文本显示; - 超长脚本按窗口分批喂给渲染器(每窗口最多 8192 行 / 8 MiB),普通用户完全无感,细节见 sidecar.rs 与 text_ass.rs。
性能设计:独立工作线程,60 fps 稳帧的底气
字幕渲染的全部耗时操作——字体解析、光栅化、合成——都发生在独立 worker 线程上,UI 线程只替换一个有界的请求槽位、读取不可变的 RGBA 结果,从不等待字体解析或光栅化。几个关键机制保证了流畅度:
- 按需渲染:每帧结果都带一个"有效期窗口",窗口内的 UI tick 不触发任何渲染任务;稳定字幕在两个事件边界之间零开销,下一边界则会提前预渲染;
- 区域像素缓存:libass 的多张图按顺序合成为互不重叠的区域(最多 64 个),移动或卡拉OK字幕在内容不变时复用已有像素,只有几何、裁剪或内容变化才失效对应区域;
- 字幕时钟插值:在稀疏的位置回调之间做插值(最多外推 250 ms),暂停、拖动和断点都会重新锚定,字幕与画面对齐不漂移。
这些行为都有像素级的原生测试覆盖(定位、分层、透明、运动、卡拉OK、ReadOrder 去重),测试夹具由 make_ass_stress.py 生成,涵盖拉丁、CJK、泰语、天城文、阿拉伯语、快速切换、卡拉OK和 4K60 场景。
哪些场景下字幕由服务器绘制
说清楚边界,避免预期落差:
| 播放方式 | 字幕由谁绘制 |
|---|---|
| Direct Play(直接播放) | PlxNative 原生渲染,完整样式 |
| Remux(本地链路、Part ≤ 30 Mbps) | 应用自己从影片的 Part 旁路读内嵌轨道并绘制 |
| 服务器 Remux 的外挂字幕 | 应用绘制 sidecar 文件 |
| 转码(re-encode) | 服务器把所选字幕烧进画面(此时样式/时机菜单会置灰并说明原因) |
转码烧录时菜单会明确提示"Drawn by your server",而 Direct Play 与 Remux 下,Style(大小/位置/颜色)与 Timing(提前/延后)菜单全程可用——样式字幕的大小和位置会锁定保留,颜色仍可调节。v0.8.0 起还支持在播放中直接搜索并下载字幕,选中文本、确认即由服务器抓取并自动开启(见 v0.8.0 发布说明)。
延伸阅读
对字幕渲染管线感兴趣的读者,可以从这些入口入手:
- 完整设计文档:docs/ass-subtitles.md
- C 侧门面与 ABI:include/ass.h、src/ass.c
- 渲染核心:rust-modules/media/src/player/ass.rs、字体注册 ass/fonts.rs
- 动画检测与有效性窗口:rust-modules/media/src/player/ass_timing.rs
- 播放器子菜单(字幕搜索、样式/时机选择)设计:docs/player-submenus.md
一句话总结:PlxNative 让电视上的 ASS/SSA 字幕第一次以"制作者看到的样子"出现——卡拉OK 逐字上色、字体附件开箱即用、中文日文正确折行,而且这一切都不以牺牲 60 fps 为代价。
【免费下载链接】plx-native
Fast, unofficial Plex client for LG webOS TVs — native 60 fps UI, 4K HEVC/Dolby Vision, no Chromium or WebView.
相关推荐
10分钟上手Fluss流式湖仓:Union Read功能实战教程
10分钟上手Fluss流式湖仓:Union Read功能实战教程 Fluss是专为实时分析构建的流式存储系统,Union Read功能作为其核心特性,能够无缝融
Jellyfin Web 项目中 ASS/SSA 字幕渲染问题深度解析
Jellyfin Web 项目中 ASS/SSA 字幕渲染问题深度解析 问题背景 Jellyfin 作为一款开源的媒体服务器软件,其 Web 客户端在 10.1
音视频前端Streamyfin 字幕支持体系全解析:从 KSPlayer 字幕引擎到 mpv 原生渲染的工程实践
Streamyfin 字幕支持体系全解析:从 KSPlayer 字幕引擎到 mpv 原生渲染的工程实践 本篇技术指南以 docs/ks player/Subti
音视频移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考