很多用户第一次用一起听会问同一个问题:为什么对方网络差,我的音质没变差?答案是房间里根本没有「同一条流」。房主与成员各自从最近的 CDN 节点拉取同一首曲目,服务端只负责广播三样东西:当前曲目 ID、播放位置、播放状态。
这套设计的好处是音质各自决定,坏处是「同步」变成了一个纯时间问题。两个人听到的同一小节,实际可能相差一两百毫秒,这在副歌齐唱时能听出来,在正常听歌时几乎无感。
同步的是位置,不是声音
位置同步采用「权威时钟 + 偏移补偿」。房主客户端每 2 秒上报一次播放位置,服务端盖上服务器时间戳后广播;成员端拿到后按自己与服务器的时钟差换算成本地位置,再与当前实际播放位置比较,差值超过 80ms 就微调播放速率,而不是直接跳转。
微调的做法是把播放速率临时改成 1.02 或 0.98 倍,持续几百毫秒后恢复。人耳对 2% 的速率变化不敏感,但能立刻察觉「跳了一下」,所以客户端宁可慢一点追,也不做硬跳。
时钟差本身也在漂。手机与服务器的时钟每分钟可能差几毫秒,客户端每 30 秒重新估算一次往返延迟并取中位数,避免单次网络抖动把估算值带偏。
40 个房间的误差分布
我们在 2026 年 9 月组织了 40 组双人测试,每组播放同一份 20 首的歌单,记录每分钟的位置差。参与者分布在 11 个城市,网络条件覆盖家宽、5G 与公司网络。
| 网络条件 | 房间数 | 误差中位数 | 95 分位 | 追帧次数/小时 |
|---|---|---|---|---|
| 同城家宽 | 12 | 180ms | 260ms | 3.1 |
| 跨省家宽 | 16 | 260ms | 410ms | 5.8 |
| 5G 移动网络 | 8 | 310ms | 520ms | 9.4 |
| 跨国 | 4 | 620ms | 980ms | 17.2 |
跨国的 620ms 已经接近「能听出来」的边界,尤其是歌词同步显示时,对方可能比你早看到下一句。这一档的追帧次数也最高,每小时 17 次,意味着平均三分半就要微调一次。
房间人数对误差的影响比网络更大。10 人房间的落队率(某一成员连续 10 秒以上偏离超过 1 秒)是 4%,25 人升到 11%,50 人满员时到 19%。原因是房主上报的位置只有一个,成员越多,网络条件差异越大,统一对齐越难。
| 房间人数 | 测试房间 | 落队率 | 平均追帧间隔 |
|---|---|---|---|
| 10 人 | 6 | 4% | 18 分钟 |
| 25 人 | 6 | 11% | 9 分钟 |
| 50 人 | 4 | 19% | 5 分钟 |
「同步这件事,做得越精细,越容易在弱网下产生 audible 的修正痕迹。所以我们把阈值定在 80ms,而不是 20ms。」——一起听项目组的公开技术分享
弱网降级:从追帧到切歌对齐
当网络抖动持续超过 500ms,或者连续三次追帧失败,客户端会切到「按曲目对齐」模式:只在切歌时同步位置,中间不再追帧。用户会看到房间顶部出现一行灰字「网络较弱,已切换为切歌同步」,但播放不会中断。
这个降级是有代价的:两个人可能相差十几秒,同一首歌听到的段落完全不同。产品侧的选择是「宁可不同步,也不要卡顿」,因为卡顿会让人直接退出房间,而不同步只影响聊天时的默契。
如果想让房间更稳,能做的主要是三件事:房主用有线或稳定 Wi-Fi、成员尽量用同一运营商、人数控制在 25 人以内。房间设置里关闭「允许成员点歌」也能减少切歌带来的重新对齐。需要客户端的话,下载页有五个平台的安装包。
用户评论(4 条)
原来不是同一条流,难怪她卡的时候我这边一点事没有,只是歌对不上。
1.02 倍速追帧这个设计挺聪明,硬跳真的很难受,像 CD 跳针。
50 人房间确实乱,上次集体听歌,一半人在副歌一半人在前奏。
跨国那档基本没法用,我在温哥华跟国内朋友听,歌词永远差一句。