# 终端直连与零视频出口

2026-10-03 · 播放路线调整 · 本轮增量

默认让用户的播放器直接连接视频源。网站只处理登录、目录、地址解析和观看记录，不读取、缓存或转发视频。后台明确选择“允许转发”后，才开放此前的内存转发与解码能力。

本页替代此前“所有媒体统一走网站网关”的默认路线。[代理与内存转发](dramivio-proxy-relay.md)保留为允许转发时的能力，不再作为默认播放路径。产品继续按已确认设计实施，目标是不显示渠道或代理名称；本轮直连失败只返回简短通用提示，来源诊断留在后台。旧列表与其他界面的来源隐藏仍按产品任务验收。

## 用户操作与判断

| 操作 | 实际处理 |
| --- | --- |
| 点击某集 | 网站鉴权，按来源 API 解析当前集的 HTTPS 地址；不向视频源发 HEAD、Range、清单、分片或密钥请求 |
| 开始播放 | 终端播放器使用源地址加载；元数据、HEAD 成功和服务器能连通都不能算播放成功 |
| 验证可播放 | 浏览器检测首帧或 Android 原生实际渲染首帧，并观察前台播放位置持续推进。判断仅代表该终端当次尝试 |
| 浏览器禁止自动播放 | 显示“点击播放”；不据此判定源无法访问，不自动转发 |
| 地址过期、短时断流 | 当前集最多刷新一次源地址，保留 run、位置、倍速和暂停状态。旧尝试不得覆盖新进度或触发下一集 |
| 仍无法播放 | 显示失败；唯一刷新已耗尽时返回选集。零出口不偷偷换到服务器转码、中转或下载 |
| 切换网络 | 继续健康播放；出现真实停滞才进入有限恢复。不用地区、IP 或服务器网络状态代替用户实播 |
| 切集、退出、进入后台 | 取消当前加载及计时；旧事件失效。暂停不计入播放停滞超时 |
| 手机已缓存某集 | 继续使用手机本地文件，不请求网站视频接口 |

首帧只是初步能力证据，后续分片、密钥、音轨和拖动仍可能失败。不能承诺首次成功就代表整集、所有清晰度或下次网络环境都成功。播放器开始取流本身就是检测，不另下载一份样本再播放。前台未暂停时连续 15 秒没有有效画面与位置推进，进入有限恢复；暂停和后台不计时，恢复后重新采集该播放器的首帧证据，已消耗的刷新机会不复原。

## 后台控制与接口

| 配置 | 含义 |
| --- | --- |
| routePolicy=direct-only | 默认；只发直连候选。旧配置缺少此字段也按此处理，旧客户端不支持则明确拒绝 |
| routePolicy=relay-allowed | 管理员明确允许网站承担视频流量，开放后端与 Web 的显式网关能力；新 App 本轮仍只直连。兼容处理使用有限 RAM，不写视频文件 |

渠道绑定的 HTTP / HTTPS / SOCKS5 代理在零出口模式下仅用于目录、详情、地址解析等元数据请求。服务器能直接访问源时，管理员可对该渠道明确选择服务器直连，减少代理的元数据费用。

播放计划继续使用现有 session / episode / run。新客户端声明 client.direct=true，计划返回 delivery=direct_candidate、当前集外部 HTTPS URL、player、已知时长和清晰度、routePolicy、attempt。candidate 表示等待终端验证，不代表网站已证实可播放。不通过网站 302 伪装直连；未知的时长、编码或源链接期限不能补造。

同集恢复使用 refresh=true、当前 run 和递增 version；尝试版本改变，run 与观看票据保持。每次打开只允许一次地址刷新，重新打开的正常观看规则仍按产品额度执行。客户端不能用 mode=proxy 或兼容回退覆盖后台零出口配置。

网站统一关闭旧视频出口，包括播放网关、旧 stream、HLS open / assets、App 下载转发与 Emby 视频请求；闸门在解析视频、FFmpeg、缓存和读取历史视频文件之前。旧视频文件和任务保留。切回零出口时，取消正在转发的会话，清理视频缓存。后台链接刷新始终只解析元数据，允许转发也不读取视频或 HLS 清单；普通目录、详情与测试连接也禁止自动跳转到视频，已知媒体响应在读取正文前拒绝。

## 双端能力

| 平台 | 本轮路线与限制 |
| --- | --- |
| Web | MP4 复用 HTML 视频并设 anonymous；直连 HLS 使用 hls.js FetchLoader、credentials=omit，逐项校验 HTTPS / 外部地址并拒绝自动跳转。没有 MSE / ManagedMediaSource 能力时提示选择 MP4，不绕到无法逐项控制的原生 HLS。清单、音轨、分片、初始化段与密钥都必须在用户网络中可访问，CORS与编码按真实加载判断 |
| Android App | 复用 react-native-video / ExoPlayer；媒体数据源独立，不继承 API Cookie、Authorization、X-Juku 或上一个播放器的请求头。使用真实渲染事件，不把 STATE_READY 当成首帧。本轮页面仅接直连，允许转发配置也不自动或人工切网关 |
| iOS App | 新页面本轮在线播放明确拒绝，手机本地播放保留。AVPlayer 默认 Cookie 存储不能靠空 headers 或删除全局 Cookie 注入关闭；独立来源网络会话需要另行实现并实测后开放 |

浏览器首帧判断见 [requestVideoFrameCallback](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement/requestVideoFrameCallback)，anonymous 的凭据范围见 [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/crossorigin)。iOS 的默认 Cookie 行为见 [Apple AVURLAssetHTTPCookiesKey](https://developer.apple.com/documentation/avfoundation/avurlassethttpcookieskey)。本轮继续复用开源 [react-native-video](https://docs.thewidlarzgroup.com/react-native-video/docs/v6/intro/)，不替换原生解码内核。

媒体请求与站点 API 请求分开。直连不能附带网站会话或源 API、代理凭据；原生来源头只接受明确白名单。直连候选必须是外部公共 HTTPS 443 地址，不接受 userinfo、片段或本网站 API 主机。HLS 子资源、密钥及音轨同样受终端地址门禁约束；域名大小写与末尾点按同一主机比较。来源自己的短期视频 URL 参数属于授权播放地址，不等于可公开源 API 的长期密钥。

后端仅对初始地址做 DNS 安全检查，不连接视频源。它不能证明用户所在地连通，也不能在不读取 HLS 清单时担保所有子资源。终端逐项限制资源和重定向；Android 网络层检查实际解析地址，浏览器无法可靠读取终端 DNS 结果，不宣称解决所有恶意 DNS 重绑定。

HTML MP4 的浏览器原生加载也不能由 JavaScript 逐跳拦截；其约束是初始 HTTPS / 外部地址及 anonymous，而不是完整 FetchLoader 网络拦截。保留这项平台差异，Safari 表现须另行验证。地址解析期间的服务器 API / HTML 请求禁止自动跳转到媒体，已知媒体响应在读取正文前拒绝，并有正文大小上限。

源方要求服务器持有的 CENC、带外密钥、秘密 Cookie，或签名绑定解析服务器 IP 时，现有终端路径可能无法播放。零出口模式明确失败，不在后台偷偷解码。Web 无法随意设置 Referer；不能保证 Android 可播的来源在浏览器也可播。

来源 API 同时提供加密高清与未加密低清时，优先从已知元数据中选择可直连版本。当前统一剧目、跨渠道同集映射仍未交付，本轮不自动猜测另一渠道的对应剧集；失败只刷新当前授权地址一次，不把来源名称或搜索相似标题当作集数映射。

## 与原业务的取舍

零出口能消除网站承担的受控视频转发字节；目录、封面、登录和地址解析仍有小量流量，供应商接口或内容授权费用按其合同计，不能承诺网站总费用为零。

源链接一旦发给用户，就可能被复制或分享。网站可以限制正规入口的每日地址授权、记录进度及登录权益，不能仅靠本站网关撤回已发出的第三方链接，或可靠阻止该链接被额外观看。严格每日 10 / 50 集、即时封禁、防复制和可信邀请观看奖励，需要源方支持短期、按用户绑定的令牌或可信回调。客户端首帧和进度报告不能直接作为防刷奖励凭证。

界面不显示渠道名称仍可实现；用户在浏览器开发者工具或网络请求中可以看到源域名。隐藏网络来源与视频直接由来源发送不能同时由本站保证。

App 在线缓存原入口通过网站下载转发，零出口下关闭。未来的终端直存属于 O00 / O01 的独立交付：需要登录、离线授权、源方可下载能力、限次地址与手机空间管理；本轮不把打开直连播放等同于完成离线缓存。

## 分阶段测试

| 技术卡 | 交付与证据 |
| --- | --- |
| DIR00 零出口闸门 | 默认 / 旧配置迁移、所有历史视频入口、策略切换取消；真实默认服务端中媒体 GET / HEAD、FFmpeg 和视频缓存为零 |
| DIR01 元数据候选 | 内置 / 标准渠道、来源 revision、秘密不出 DTO、公共 HTTPS、当前集归属、未知能力不伪造、源无法迁移到终端的错误 |
| DIR02 Web 实播 | Chrome 实际 MP4 / HLS 首帧与拖动；全部子资源凭据抓取、失败 / 自动播放 / 超时 / 一次刷新 / 旧回调；不请求本站视频出口 |
| DIR03 Android 实播 | 原生无 Cookie 数据源、旧网关到直连切换、实际渲染事件、有限恢复、同 run 位置与倍速；自动测试与原生编译不替代真机 |
| DIR04 上线关口 | 实体设备与真实来源、Safari、网络变化、源 token 及额度 / 邀请能力；网站入口统计零视频字节，代理统计仅元数据字节 |

升级需要新版 Go 与包含原生补丁的 Android 安装包；只更换 JS / OTA 不能提供凭据隔离能力。旧包缺少能力常量时明确提示更新，不降级到服务器视频出口。先在测试环境联调，再按所选零出口策略升级真实服务；本轮只更新代码与静态文档，不发布 API、安装包或 OTA。

这些技术卡补充既有 25 张产品任务，保留 149 个设计状态。登录、真实去重与服务端分页、可信额度 / 邀请、逐集记录及离线授权仍按原产品任务交付，受本页的直连边界约束。

## 本轮验证记录

| 范围 | 实际结果 |
| --- | --- |
| Go 后端 | 全量 go test ./... 通过，app 包 38.591 秒；14 组直连、后台刷新与错误隐藏专项 race 通过，9.626 秒；构建与差异检查通过 |
| Web | 79 项 Node 测试通过。Chrome 9 个实际 TLS 媒体场景与 3 个生命周期场景通过：MP4 / AES HLS / MP4 跳转实际解码并拖动定位；跨域、恶意清单、HLS 跳转、坏 MP4、仅元数据及纯音频失败均只刷新一次同一 run，不误完成或切集 |
| Android App | 50 项自动测试与类型检查通过，其中 8 组运行真实 React PlayerScreen 组件，验证旧回调、无新首帧、暂停、后台取消、切集及 15 秒恢复期限。补丁中的实际 JukuMediaClient 完成 JVM HTTPS 请求，覆盖 Cookie / 头隔离、HLS 资源、重定向、TLS、私网与混合 DNS、API 主机变体。Android 播放器库 Kotlin / Java 编译通过，未打包或运行真机 |
| 持久补丁 | 精确固定 react-native-video 6.19.2；使用与锁文件相同 integrity 的干净归档加补丁，重构的 6 个源文件逐个 SHA-256 与本地原生源码一致。postinstall 补丁应用检查通过；原生能力门禁拒绝只有新 JS 的旧安装包 |

浏览器媒体在本机生成，经测试专用 CONNECT 映射提供公开主机名、HTTPS 443 与 TLS；仅测试环境忽略自签证书错误，没有放宽生产地址规则。检查到来源 Cookie / Authorization / X-Juku 为零，本站视频接口请求为零。自动播放拒绝使用 play 拒绝夹具，后台变化使用 visibility 状态模拟；其恢复行为已验证，不等于覆盖所有真实浏览器策略。真实来源、实体设备与 Safari 尚未验收。

独立子 agent 对抗复审发现的 7 类问题已关闭：后台刷新读取媒体、App 旧回调恢复有效、Web 无画面误完成，及 Web 子资源地址、App 主机变体、后台取消误报、错误暴露来源名称。复审也核对了 Android 持久补丁与实际原生源码一致。通过范围为源码、上述测试与夹具；本页是本轮网络增量，不能据此认定邮箱登录、真实额度核销、邀请或全部产品功能已交付。

在线文档只发布静态页面和文档包。真实后端与 Android 安装包尚未发布，不能以此次文档更新认定已经产生生产流量节约。
