NAS 视频串流解决方案

· Tech

起笔于二〇二二年十一月,发表于二〇二三年四月。

某个周五的晚上,我和鬼鬼结束了一周的工作,坐在电视机前,满怀期待地打开 NAS 上保存的某热门电影宇宙的最新一部作品。然而,视频画面却十分不流畅,几秒中卡顿一次,完全无法正常观看。

就在几个小时前,我还得意地告诉鬼鬼,我搞到了这部作品的 4K HDR 高清资源,盛情邀请她一同观赏,来度过这个愉快的夜晚。如今这个局面,可谓十分尴尬——这不是翻车了嘛!

我的 NAS 是群晖入门级的 DS220j,购于两年多以前。不仅盘位只有两个,CPU 和内存也是捉襟见肘,只能跑跑自带的下载、文件传输、视频监控等功能,不支持 Docker。NAS 里存放着一些电影和剧集,通过海外版小米盒子(运行安卓系统)上的 VLC 播放。大部分资源都能流畅播放,也支持字幕。虽然没有任何的媒体管理功能,界面也十分粗糙,但考虑到播放效果过得去,我一直对这套挂壁方案还算满意,直到这一次。

众所周知,一个垃圾佬在捣鼓自己的东西时可以尽情挂壁,但绝不能牺牲领导的体验。所以,虽然得到了鬼鬼的暖心安慰,我仍下定决心,好好升级一下家里的视频串流方案。当然,在满足要求的前提下,尽可能少花钱。

首先要做的,是确定播放卡顿的原因。从 NAS 串流视频需要经过以下几个步骤:

  1. NAS 读取本地硬盘的视频文件
  2. 通过局域网串流至播放设备
  3. 播放设备解码

前两步理论上不会有问题。NAS 的机械硬盘虽慢,CPU 也拉跨,然而不至于连串流所需的读取速度都满足不了。串流使用的是 SMB 协议,在我家局域网的文件传输速度大约是 30MB/s,而一个时长两小时的 40GB 视频文件所需带宽仅为 5.5MB/s,比这低得多。

看来问题大概率出在播放设备,也就小米盒子。这个好测试,换一个播放设备嘛。我偶尔也会在 iPhone 手机上播放 NAS 上的视频,所以上面也装了 VLC。用它播放 40GB 的文件,画面流畅,但没有声音,而且发热严重。我又换了一个类似码率的高清视频播放,结果依然流畅,声音也正常,但是仍旧发热。这说明了两个问题:一,之前的卡顿的确是播放端的问题,与 NAS 和网络无关。这无疑是个好消息,因为升级这两样的成本可比升级播放端高多了。二,VLC 或许兼容性不佳,卡顿和发热应该都是硬解不可用,只能软解造成的。iPhone 的芯片足够强大,即使软解也能流畅播放,但是这种高强度任务难免会增加功率,产生热量。至于小米盒子,连流畅播放也不能指望了。

为了验证 VLC 不行,我决定换一个播放器 app 试试,于是选择了大名鼎鼎的 Infuse。Infuse 是苹果独占的播放器,支持 iPhone,iPad,Mac 和 Apple TV,尤其在 Apple TV 上出镜率很高。

我用 Infuse 打开了这个 40GB 的视频。嗯,怎么说呢,真是如沐春风啊。画面、声音全部正常,播放流畅无卡顿,并且自动开启 HDR、加载字幕。界面美观易用,如同 iOS 的第一方 app,和 VLC 那明显从 PC 移植过来的界面相比,简直是天壤之别。它甚至还有海报和字幕搜刮功能。原来这才是专业的影视播放器啊!那一刻,我就知道我再也回不去 VLC 了。就这样,串流播放在手机上完美实现了。

现在回头看看小米盒子的问题。小米盒子离路由器很近,WiFi 信号不会比 iPhone差。硬件方面,根据说明书,它支持硬件解 H.265。看来换一个播放器 app 就有希望解决问题。安卓上对标 Infuse 的播放器应该是 Kodi,功能同样强大,但界面是满满的工程师和极客味,能感受到两者社区的巨大差异。Kodi 可以流畅播放高清视频,声音也正常。

然而,我随即意识到小米盒子本身有些问题。它不能开启 HDR,而且分辨率被锁在 1080p,无法设置为 2160p。这些功能在说明书中是支持的。尝试了更换 HDMI 线,无果。似乎小米盒子是不堪大用了。那么电视自带的 Roku 系统呢?Roku 的软件生态不如安卓,只能用它自带的播放器。虽然也可以流畅播放高清视频,也支持 HDR,但不支持字幕,界面功能也很简陋。

事已至此,看来只能花点钱升级一下播放设备了(太好了,有理由买新玩具了)。

市面上主流的产品有 Apple TV,Google Chromecast with Google TV (名字真长啊) 和 NVIDIA Shield。Shield 对家庭影院和外接音响的支持最好,但是我短期内并没有组建家庭影院的计划。而且有了小米盒子的教训,第三方设备不在首选之列,更何况它既贵又丑。Apple TV 和 Chromecast 都是我很喜欢的产品。安卓系统还有一个优势,那就是我们在用的 K 歌 app 只有安卓版本。如果选择了 Apple TV,意味着需要为了 K 歌保留安卓系统的小米盒子。然而这些都不重要,我毫不犹豫地选择了 Apple TV。这在我第一次使用 Infuse 的时候,就已经注定了。

此时 Apple TV 2022 发售在即,2021 版获得了不错的折扣,果断入手。2022 有一些不错的升级,不过对于我的使用场景,2021 已经完全够用。

两天后,亚马逊准时送达。设置好新机,第一件事就是安装 Infuse。果然没有令我失望,Apple TV 的 Infuse 采用和 iOS 同样的交互逻辑和设计语言,配合遥控器的触摸功能,使用体验十分愉悦,在大小屏幕上达成了令人满足的统一。不出意外,Apple TV 通过 Infuse 也能流畅播放 NAS 所有的高清视频资源,各方面效果都无可挑剔。

至此,最初的目标圆满达成。但是在见识了 Infuse 搜刮海报的能力后,我想更进一步,把所有的资源整合进媒体库中。Infuse 可以把一个 NAS 目录下的视频文件自动整理成媒体库,但是前提是通过 SMB 协议连接,不支持速度更快的 UPnP。速度的区别在播放时感觉不到,但如果大范围拖拽跳转,就能感知到 SMB 的延迟更加明显。有没有一种协议,可以像 SMB 那样支持媒体库,又有 UPnP 的速度呢?还真有,那就是 Plex 协议。Plex 是一个多媒体管理平台,由 server 和客户端两部分组成,两部分都支持所有主流平台。其中 server 可以安装到群晖上(是的,孱弱如 DS220j 也是可以的),这样客户端就可以通过 Plex 协议访问NAS 上的资源。客户端可以是 Plex 自己的播放器,也可以是 Infuse 这种支持 Plex 协议的第三方播放器。Plex server 本身就支持海报搜刮和影片整理等功能(媒体库嘛),播放器只需要从 server 加载 metadata 即可。这样的好处是,只需要在 server 上配置一遍,各个客户端的行为便能统一。

这里多说一句,Plex 播放器本身十分优秀,试用了一下,觉得播放效果不逊于 Infuse。但是如果想解锁 Plex 播放器的全部功能,需要订阅或购买 Plex 的会员。会员还包含其他强大的功能,比如从互联网访问 Plex 中的资源、根据网络情况将资源在服务器转码成指定的分辨率后再串流等等。由于这些功能暂时用不到,我选择了免费版 Plex + Infuse 订阅的方式,价格比 Plex 订阅要便宜。

最后,为了进一步提升传输速度,也为了不浪费 Apple TV 的以太网接口,我买了一个入门千兆交换机,将 Apple TV 通过以太网接入。测试下来,一段时长两小时、大小为 40GB 的视频,可以在一秒钟之内从任意进度加载。

串流方案的升级到此完成。与之前相比,新的方案可以流畅播放、跳转高码率的高清视频,UI 易用性获得了极大提升,支持酷炫的海报墙、影片剧集归类、内容简介、演员表、字幕搜刮。电视盒子的流畅度、遥控器手感也大幅提升,还获得了原生 AirPlay 功能。花费的成本如下:

  1. Apple TV 2021:$100
  2. Netgear 五口千兆交换机:$20
  3. Infuse Pro 订阅:$10/年

总体来说,这次改造相当成功,我自己也很满意。不仅因为最后的结果理想,也因为研究的过程很有趣,每一点 progress 都能带来成就感。利用自己的知识、双手和学习能力,让生活变得更好一点,可能这就是所谓的「热爱生活」吧。