# 视频屏保 控制中心 → 个性化 → 屏幕保护程序 →「视频」。用手机扫描同一页的二维码,在手机页选「视频」后添加 MP4 或 MOV;可以多选,逐个上传。上传不会替用户选择屏保,也不改变壁纸。 影片保存在电视本机,静音、随机排列后循环播放;左右键切上一段、下一段,其他键唤醒。没有影片,或所有影片都打不开时,回退到照片屏保。手机页可以逐段删除。 建议 1080p H.264,兼容 Android 5.0 起的电视。其他编码取决于电视自己的解码器;不在电视上转码。每段上限 2 GB(2,000,000,000 字节),所有影片合计最多占「已存影片 + 剩余空间」的一半,并且始终留 1 GiB 空闲,最多 64 段(#1164;以前是每段 200 MiB、共 512 MiB)。手机页从 `api/state` 的 `videoRoom` 读还能放多少,在说明里显示,放不下的影片不发送。 ## 实现 - `ScreensaverVideos` 管理应用私有目录 `files/screensaver-videos/`。上传先校验是否有视频轨和时长,再复制到暂存目录、原子改名发布;总容量、单段大小和数量均有限制,删除只接受本库生成的 ID。 - 上传接口 `POST api/videos/send?name=<文件名>`,请求体就是文件本身(`application/octet-stream`),`ScreensaverVideos.receive` 边收边写进库目录里的 `import-.part`,写完再走上面的校验和发布。不用 NanoHTTPD 的 `parseBody`:它先把整个请求体写进缓存,再把文件部分复制一份,还把整个请求体 mmap 进内存,2 GB 的影片要占 4 GB 临时空间,32 位电视(小米 MFTR0 是 armeabi-v7a)也映射不了这么大。放不下或文件名不是 mp4 / mov 时不读请求体,直接回 `saved: false` 并关掉连接。旧的 multipart 接口 `api/videos/upload` 已删除(页面跟 APK 一起发布)。 - `VideoSaver` 使用 Media3、本地文件和一个有界缓冲的播放列表。影片打不开或 8 秒仍不能播放,就从本轮队列移走;不会因为解码失败删除用户文件。退出屏保会释放播放器。 - 桌面空闲屏保和 `AerialDream` 复用同一个组件,沿用现有左右切片、返回键和空闲计时。 - APK 中只有代码和五种语言的界面文字,不含动画。素材通过手机页原有的本地令牌地址导入。 ## 验证 KKTV U86V9 / Android 9 上用并行 release 包预编译后测试:12 段 1080p H.264 影片均通过手机页导入,抽查播放、自动进入下一段、左右切片、确认键唤醒回到主页;从手机页删除本次导入的影片后,空列表回退到照片,再重新导入成功。电视的「视频 / 立即开始」入口可用。中、英、俄、乌、哈五种手机页在 390px 宽度下无横向溢出。 standard / guard release 和 17 项 JVM 测试通过(其中 6 项验证导入与存储边界)。系统级 Dream、其他电视解码器、长时间循环及待机唤醒未在真机验证;不代表所有 MP4/MOV 或 HEVC 透明素材都能播放。 2026-11-02(#1164):小米 MFTR0 / 1.78 + 本次改动的 standard release,用和手机页相同的请求上传 616 MB 的 1080p H.264(文件名「测试大视频.mp4」):12.6 秒存好,名字正确,`/data` 只多占一份(约 617 MB),进程 PSS 约 280 MB;声明 2.5 GB 的请求、扩展名为 `.txt` 的请求都在 0.06 秒内被拒,库里不变。手机页说明显示「现在还能放 2.0 GB」。测完按 id 删掉了测试影片。没有在电视上播放这段影片,也没有测 TCL 和 Lite。