Watch Together 是一个运行在 Emby Server 内的双人同步观看插件,当前项目版本为 1.4.3.0。它读取同一台服务器上的会话状态,并通过 Emby 远程控制协调起播、暂停/继续、手动拖动进度、切换视频和停止播放。
本文面向 Emby Server 管理员和插件使用者。维护者或开发者需要构建、测试、签名发布、接口和运行时细节时,请阅读开发者与维护者技术文档。
插件只负责房间内的协调,不会修改媒体库、转码设置或播放器客户端。正常播放期间不会为了消除网络延迟和小幅播放差异而反复跳转。
- 管理员创建一个包含两名用户的房间,并指定主用户;每名用户同时只能属于一个房间。
- 两位参与者打开相同视频后,插件会先暂停双方,以主用户位置为基准对齐另一端,再恢复起播前的暂停/播放状态。
- 播放过程中会同步明确的暂停/继续和明显的手动拖动,不会为了消除小幅播放差异而持续跳转。
- 切换到不同视频时回到等待状态,不会跨视频追赶;两人同时播放时按安全规则处理,单人播放受到保护。
Watching已开始后,一方停止状态持续达到 2 秒才确认停止,默认暂停另一方并发送提示;临时同用户替换的会话(不同SessionId,包括不可远控的快照)不能清除观察,只有原Previous SessionId+ItemId且在线、未停止并支持远程控制才算恢复。暂停和提示行为可以分别关闭。- Emby 管理页提供房间创建、加入/退出、暂停、继续、重新同步、删除和状态查看。
- 遇到网络或 Emby 暂时不可用时,插件会有限重试并显示状态;单个房间异常不会终止其他房间的同步。
- 同一用户的多会话只有在存在唯一历史
SessionId+ItemId关联时才会沿用;没有历史或关联失效时保持等待,不会猜测会话。 - 管理员手动暂停/继续遇到 Barrier 或任一参与者存在 Pending 时整次拒绝,不覆盖正在进行的同步;成功操作不会误报陈旧的运行时错误。
- 退出触发的自动暂停返回稳定的
Attempted、Succeeded、Failed汇总,管理页分别显示成功、失败和未尝试;群发消息单目标异常会继续发送其余目标并区分Sent、Failed、Skipped。
- 目标环境为 Emby Server 4.9 API。
- 一个房间恰好两名参与者,且两人必须登录同一台 Emby Server;不支持跨服务器或多人同步。
- 两个会话必须打开相同视频、媒体时长相差不超过 3 秒、播放速率接近正常速度,并同时支持暂停、继续和拖动进度等远程控制。客户端没有这些能力时房间会停留在
Waiting。 - 同步基于服务器提供的会话状态,不是播放器内部时钟;不保证每一帧完全相同,也不主动消除长期的小幅漂移。
- 不依赖外部运行时、脚本或额外服务;消息展示、远程控制和确认延迟仍取决于实际 Emby 客户端。
- 在 Emby Server 管理后台确认服务器已停止写入旧版本(升级前建议备份旧 DLL)。
- 从发布产物解压
EmbyWatchTogether.zip,得到根目录下的Emby.Plugins.WatchTogether.dll。 - 将 DLL 直接复制到 Emby Server 数据目录的
plugins目录,不要再套一层EmbyWatchTogether子目录。若不确定数据目录位置,可在 Emby 管理后台的服务器路径页面查看。 - 启动或重启 Emby Server。进入 Dashboard → Plugins → Watch Together,确认设置页能够打开。
插件是单 DLL 交付,不需要复制源码、NuGet 包或其他旁车进程。升级时停止 Emby、替换 DLL 后再启动;回滚时恢复备份的旧 DLL。插件默认使用 stable,管理员可在插件配置页选择 beta;stable 只读取 releases/latest,beta 按 GitHub Releases API 获取预发布版本。两种通道都由“Watch Together 更新检查”任务按所选通道自动安装,Emby 的任务开关和计划仍是控制入口。beta 仍是预发布版,自动安装不等于真实客户端验收。
插件更新由 Emby 计划任务处理,插件配置页提供更新通道选择,但不提供独立的检查或安装按钮。服务器启动后,Dashboard → 计划任务 中会出现名为“Watch Together 更新检查”的任务,默认每 24 小时运行一次;管理员可以在那里调整检测时间、禁用任务或手动执行。任务会按插件配置中的 stable/beta 通道检查并自动安装。
stable 使用固定的官方 releases/latest 资产;beta 使用 GitHub Releases API 选择 prerelease 后构造对应 tag 的官方资产。两种通道都会在安装前校验发布签名、文件大小、哈希、程序集名称和版本;校验失败时不会安装。安装由 Emby 的插件安装器负责,插件不会自行覆盖 DLL,也不会调用重启或关机。安装成功后插件会通知 Emby“等待重启”,仪表盘会出现重启提示;如果检查后已是最新版本,当前管理员会话也会收到同样的短横条提示;重启前同一版本不会重复安装。
首次信任引导版本 1.2.0.9 必须由运营人工部署;完成后版本方可使用签名自动更新。如果服务器尚未完成首次信任引导,请先按人工安装方式部署该版本。正式版更新的发布资产、签名格式和信任根约束见技术文档中的更新实现说明。
-
使用管理员账号打开 Watch Together 页面。
-
填写房间名称,选择两名不同的参与者,并从两人中指定主用户。
-
创建后让两名用户登录同一 Emby Server、打开同一个视频;必要时在房间卡片上点击“加入房间”。
-
房间状态依次可能显示为:
Waiting(等待参与者或等待双方打开同一 Item);Barrier(正在暂停、Seek 和恢复);Watching(已完成起播同步);Unavailable(房间归属的服务器 ID 与当前实例不一致)。
进入 Watching 后,暂停/继续和明显的手动拖动会传播到另一端。管理员可以对房间执行暂停、继续或重新同步;重新同步会清理运行时状态并重新执行 Barrier。
设置页的“播放停止行为”区域提供两个独立开关,默认均开启:
| 配置项 | 默认值 | 作用 |
|---|---|---|
PauseOtherOnPlaybackStop |
true |
一方被会话快照持续确认停止后,暂停仍在播放的另一方 |
NotifyOtherOnPlaybackStop |
true |
同一停止状态确认后向另一方发送文字提示 |
配置由 Emby 保存,只有管理员可以修改。两个停止行为开关保存后会在下一轮同步中生效。轮询参数、配置热更新行为以及当前保留但不参与实时策略的字段见技术文档。
- 状态长时间为
Waiting:确认两人已加入、在线会话打开相同 Item,且客户端报告了 Pause、Unpause、Seek 能力。 - 状态出现不同视频提示:两端 ItemId 不一致;插件不会跨视频追赶,重新打开相同视频即可触发新的 Barrier。
- Barrier 失败:查看房间卡片的错误信息,确认 Emby 能返回更新后的 SessionInfo;命令会有限重试,冷却结束后自动重试。
- 频繁跳转:本插件只对明显单次跳变发送 Seek。若正常播放仍反复跳转,应先检查其他客户端、插件或遥控器是否在发送 Seek。
- 停止后另一端未暂停或未收到消息:检查设置页两个开关,以及目标客户端是否支持 Pause 或 DisplayMessage。
维护者和开发者需要的版本规则、构建/测试/打包、签名发布、项目结构、运行时持久化和 REST API 说明见开发者与维护者技术文档。