为什么给鸿蒙做一个原生影视库

更新于 2026 年 8 月 31 日 · Vela Player 的设计取舍

一句话:Vela Player 不是把某个成熟播放器搬到鸿蒙上,而是按鸿蒙的能力与约束重做的。下面写的是五个真实的取舍——每一个都是在两条路里选了一条,也都付出了具体代价——外加一节坦白当前还做不到的事。功能清单在首页,这篇讲的是清单背后的判断。

取舍一:系统硬解优先,而不是全程软解

全程软解是很有诱惑力的一条路:自带一套解码器,什么格式都自己解,行为完全可预测,也不用管每台设备的芯片差异。不少跨平台播放器就是这么做的,工程上干净得多。

没选它的理由只有一条,但很硬:手机是电池设备。软解一部 4K HEVC 会把 CPU 长时间拉满,发热、掉电、降频接踵而至,一部两小时的电影未必看得完。而且画中画、后台播放这类系统能力也是跟着系统播放器走的。

所以实际做法是三档接力:系统 AVPlayer 永远首选(硬解、低功耗、画中画),覆盖 H.264 与 HEVC 8/10bit,AV1 按设备能力探测;系统解不了的自动切内置 libmpv 软解引擎接管,RMVB / RealVideo、OGM、WTV、DVR-MS、MXF、VC-1、MPEG-2 这些冷门格式都在这一档;再不行还有 FFmpeg 转码桥兜底。切换发生在起播那一刻,界面上还是同一个播放器,你不需要知道哪一档在工作。

代价是要维护三套播放实现并让它们的状态对齐——进度、音轨与字幕的选择、暂停恢复、音频焦点被别的应用抢走时怎么办,每一样都要在三条链路上各做一遍。远比只写一套麻烦,但省下的是用户的电量。硬解与软解的差别单独写在这一篇里。

取舍二:刮削按目录结构判定,而不是维护目录名黑名单

「哪些文件该入库、哪些是花絮」这件事,最常见的做法是列一张黑名单:SampleExtrasTrailers、「花絮」,扫到就跳过。简单直接。

问题是这张名单永远追不上发布组。真实遇到过的附属目录名包括 Sample,ScreensBox Cover,PosterSubtitle,infoExternal AC3,以及一个叫「奥斯卡获奖动画长片」的目录——最后这个尤其说明问题,它看起来完全像一个正经的作品目录,任何黑名单都不会把它列进去。

所以判据换成了结构与时长:子树里最长的片子,短于同一部作品正片的四分之一,就判为附属(时长拿不到时退回文件体积比)。这一条判据把上面那些花样名一次全认了出来,而且不需要维护任何名单。整体的分工是:目录结构决定「哪些文件该入库、谁是正片、哪几个互为版本」,文件名决定「叫什么、第几季第几集」

结构判据自己也有坑,最要命的一个是同目录多个视频文件怎么解释。规则得分三种,缺一不可:变集号是分集,变技术参数是版本,变片名是不同的片。第三条最容易被省掉,而省掉的后果是静默丢片——「蜘蛛侠 8 部合集」目录下平铺的《平行宇宙》《英雄归来》《英雄远征》会被当成同一部片的三个版本合成一条,9 个文件只入库 4 条,界面上不会有任何报错。静默丢东西比报错更坏,因为你根本不会去找。

代价:几百个文件平铺在一个目录里的片库,结构里没有可用信息,负担全压回文件名上——仍然能扫,只是准确率取决于命名。纠错方法见电影刮削完全指南

取舍三:网盘做端内直连,而不是让用户自己搭中转

接网盘最省力的做法是只支持 AList / OpenList:应用只需要说一种协议,接一次就通吃十几家网盘,后续每加一家新网盘都是 AList 那边的事。工程量差了一个量级。

没把它当作唯一方案,是因为门槛:要一台常开的服务器或 NAS,凭据存在那台机器上,而且夸克这类源的视频在 AList 侧走服务端代理,会吃中转机的带宽。对「只想在手机上看夸克里那几部片」的人,这个门槛高得离谱。

所以夸克、UC、天翼、移动云盘四家做了端内直连:登录在各家官方登录页完成,应用不接触你的账号密码,凭据交给鸿蒙系统级密钥库保管,手机直接连网盘,不经过任何第三方。同时 AList / OpenList 照样支持——两条路并存,不是二选一,已经有服务器的人不吃亏。

代价是每家各写一套,而且是持续的维护成本。各家的认证方式、错误码约定、字段转义、直链有效期全不一样,任何一家改一次接口都要跟着改。举个具体的:夸克的直链签名绑着 Cookie、Referer、User-Agent 三个请求头,且必须与取链那一刻逐字一致,所以直链根本不能缓存进数据库,每次播放前都要现取——这类细节每家一套,展开写在夸克进阶篇里。

取舍四:本地优先,没有服务端

另一条路很标准:做一个云端账号,片库、进度、设置全同步,顺便还能做推荐、看数据、发推送。绝大多数做大了的应用都走这条。

没走,理由是这些数据的性质:媒体库是你的私人片单,观看记录是你的私人作息。这两样一旦上了云,就变成一份需要被保管、可能被泄露、也可能被拿去做别的事情的数据。而这个应用不需要它们就能工作。

所以实际形态是:媒体库与观看记录存在本机 SQLite;源密码交给鸿蒙系统级密钥库,不落明文;不接任何第三方统计、广告或推送 SDK,没有自建行为上报,应用没有服务端。离开设备的只有两类请求——发往你自己配置的服务器或网盘的访问请求,以及为匹配海报而发往元数据接口的查询词(通常就是片名和年份),刮削结果缓存在本机。

代价必须写清楚:没有账号,就没有云端同步。换一台新设备,媒体库是空的——要重新加源、重新扫一遍,因为那份库只存在原来那台设备上。这是真实的功能缺失,不是「我们认为你不需要」。

观看进度是个例外,但也只是局部的例外:在你自己的、登录同一华为账号又处在同一局域网的鸿蒙设备之间,进度可以自动合并,走的是系统的近场分布式能力,不经过云端。前提是那台设备上也已经把同一部片扫进了自己的媒体库——它匹配的是本机库里的条目。条件不满足时就是各看各的,所以这一条我们只说它「可能帮到你」,不当成承诺。

有一部分是补上的:跨设备接续走鸿蒙自己的分布式能力,手机上看到一半,在平板或鸿蒙 PC 上接着放,进度、当前音轨与字幕、字幕延迟一起带过去,不经过任何云端。但要说清区别——接续是「此刻把这一场播放传过去」,和上面那条进度合并是两件事:两者都不会替你同步媒体库。想要「多台设备长期看到同一份库、同一份进度」,目前更实际的办法是把片库跑在 Emby / Jellyfin / Plex 上,库和进度都归服务端管。

取舍五:智慧屏单独排版,而不是把手机布局放大

把手机布局按比例放大,是适配大屏最省事的做法,很多应用就是这么上电视的。

它不行的原因是方向不对:手机是竖屏的「上图下文」纵向流,横到 16:9 的大屏上会散架。详情页第一版就是这么散的——同一屏里出现了四条不同的左边界:海报一条、标题一条、按钮一条、简介一条;简介横跨大半个屏幕,一行读不完,右侧却空着一大片;剧照只占上半屏,底下压着一条硬边,海报还骑在那条骑缝上。

所以电视上的详情页是独立的一套:剧照铺满首屏,左到右的渐变托住文字,信息全部收进左半屏并对齐同一条基线,简介限三行。列表型页面(设置、文件)则限宽居中——铺满时「字幕」和它右端的取值隔着大半个屏幕,三米外根本对不上。海报墙反而不限宽,网格本来就该铺满,二维扫视没有长行的问题。

判断标准可以概括成一句:同一屏里出现两条以上左边界,或者一行文字横跨半屏以上,就该为电视单独排。

还有一批只在电视上成立的细节,每条都是被真机逼出来的:横滚行的「全部」入口挪到行末当最后一张卡(留在标题行右侧的话,从导航栏按一下方向键往下第一个撞上的就是它,海报一张都碰不到);首页向下滚动时顶栏收起(1280×720 的界面基准上,顶栏加页面大标题一度吃掉首屏近三成高);以及因为电视没有触摸屏,加源要先用「扫描局域网」自动填地址、网盘用手机扫码登录。这些写在智慧屏那一篇里。

代价是两套布局各自维护,同一个功能改一次要检查两处。

坦白:现在还做不到的

上面五条讲的是选了什么。这一节讲还差什么,按重要程度排:

常见问题

为什么不做成跨平台的?

上面五条取舍里,有四条的答案都依赖具体平台:硬解要贴着系统播放器走,跨设备接续是鸿蒙的分布式能力,密钥库是系统级的,智慧屏的走焦模型是这套 UI 框架特有的。做成跨平台意味着这几样全都要退回到最小公约数——那就退回成一个「能打开文件的播放器」了。

应用会看到我的片单吗?

看不到。没有服务端,也没有任何统计 SDK,媒体库与观看记录都在本机。想核对的话,隐私说明在隐私政策页。

首个版本免费,后面会怎么收?

首个版本免费。后续计划把远程媒体源、媒体库刮削这类能力做成 Pro 订阅,届时会明确写清哪些功能属于哪一档,已有功能不会转成收费

相关阅读:鸿蒙上有 Infuse 吗鸿蒙视频播放器怎么挑电影刮削完全指南