[分享创造] 忍受不了官方 NAS 客户端的卡顿,我用 Flutter 手搓了一个“零缓冲”的 SMB 播放器和漫画直读工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
pro/about
killersaca2026

[分享创造] 忍受不了官方 NAS 客户端的卡顿,我用 Flutter 手搓了一个“零缓冲”的 SMB 播放器和漫画直读工具

  •  
  •   killersaca2026 12 天前 867 次点击
    大家好,我是个重度 NAS 玩家( Datahoarder )。

    一直以来,我都在忍受各大官方 NAS APP (比如 DS Video )的折磨:索引慢得令人发指,播放高码率 MKV/TS 文件时缓冲转圈让人崩溃。而且想要看 ZIP/CBZ 格式的漫画,还得先下载解压,简直反人类。

    iOS 上虽然有 Infuse 这样优秀的应用,但 Android 和 Fire TV 上却很难找到一个能让我满意的“即点即播”的纯粹播放器。于是,我决定自己造个轮子:Nas Player Pro 。

    这里分享一下我填坑的两个技术点,以及被 AI 折磨的经历:

    1. 解决 SMB 视频流的卡顿(本地代理方案)
    直接把 smb:// 丢给播放器,拖拽进度条时卡顿非常严重。我的解决方案是:在本地起一个轻量级 HTTP 代理。播放器向本地代理请求视频流( Range Request ),代理再将其转化为 SMB 请求去精准拉取 NAS 上的对应字节。加了这一层后,几十 GB 的视频在局域网内实现了真正的“零缓冲”秒播和秒拖拽。

    2. 不解压直接通过网络阅读 ZIP/RAR 漫画(二进制解析)
    为了实现秒开漫画,我死磕了 ZIP 和 RAR 的二进制规范。
    利用 SMB 的随机访问特性,只读取文件末尾的“中心目录( End of central directory )”,解析出每张图片的 Offset (偏移量)和大小。当滑动到下一页时,直接通过 SMB 按需提取那几十 KB 的字节并在内存中解码。完全不需要下载整个压缩包。

    3. 被 AI 辅助编程( Vibecoding )折磨的日常
    在开发过程中我大量使用了 AI ,但现实并非一键生成代码那么美好。AI 就像一个记忆力只有 7 秒的疯狂实习生,在帮我修复 UI Bug 的同时,会擅自“重构”并删掉我好不容易写好的二进制解析逻辑(幻觉严重)。由于当时还没习惯用 Git ,我只能靠疯狂复制备份文件夹来和它进行“肉搏战”。

    虽然过程充满血泪,但这个无广告、不扫描索引、纯粹追求速度的工具终于上架了(支持 iOS / Android / Fire TV )。

    如果这里也有被 NAS 播放痛点折磨的折腾党,欢迎来试试我的心血之作,也非常期待大家的硬核技术反馈!

    官网介绍与各平台下载链接(支持英文):
    https://killersaca.github.io/Privacy-Policy/NasPlayerPro.html#en
    2 条回复    2026-04-12 20:36:03 +08:00
    Hansah
        1
    Hansah  
       12 天前
    7 刀?
    nidhogger
        2
    nidhogger  
       12 天前 via Android
    op 能否发个码体验?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     899 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 20:20 PVG 04:20 LAX 13:20 JFK 16:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86