通话、游戏与直播

通话与远程会话报告、通话模式、会前检查、到游戏服务器的 ping 和直播叠加层。

通话报告

每次通话后,Kilobat 都会告诉你通话是否卡顿以及原因。当 Zoom、Microsoft Teams、FaceTime、Slack、Webex、Discord、WhatsApp、Telegram、Signal 或浏览器使用麦克风超过十秒时,它就会察觉到通话。它从不收听通话内容:它只看到哪个 App 在使用麦克风,而这一点 macOS 本来就会显示。在通话结束前,它每秒 ping 一次互联网和你的路由器,记下最忙的其他 App,并每五秒检查一次 Mac 的 CPU、内存、温度和 GPU。

连续两秒或更长时间 ping 丢失,或 ping 比该通话平常慢 200 ms,就算作一次卡顿。每次卡顿都会标出原因:当时有其他 App 在上传或下载、你网络上的其他设备(根据路由器的流量计数器,前提是路由器通过 UPnP 共享它们)、Wi-Fi(路由器也同时停顿时)、隔空投送扫描,或发生在路由器之外。此外,卡片还会说明 Mac 本身何时吃力:CPU 满负荷(以及是哪个 App 造成的)、内存不足、Mac 因过热而自行降速,或 GPU 满负荷。卡片会显示在“健康 › 通话”中,并以通知形式出现。没有 Pro 时,它会显示通话卡顿了几次;Kilobat Pro 会指出原因并给出可以尝试的办法。可以在“设置 › 网络 › 每次通话后报告”中关闭。在终端中,kilobat calls 会列出这些卡片,智能体可以通过 get_call_reports 获取它们。

如果通话在路由器之外(即通话服务自己的服务器所在之处)卡顿,Kilobat 会在通话结束时查询该服务的状态页面,卡片会说明它当时报告的内容:“Zoom 的状态页面当时报告了故障”,并附上事件和链接;或者说明它当时未报告任何问题。这部分功能免费。

SSH 和远程桌面报告

SSH、Mosh 或远程桌面会话结束后,Kilobat 会告诉你输入是否延迟、画面是否卡顿,以及原因。它会统计拥有自己终端的 ssh 或 mosh-client(有 tty,或父进程中有 Terminal、iTerm2、Ghostty、WezTerm、kitty、Warp 或 VS Code 等终端 App),以及正在显示远程屏幕的屏幕共享、Parsec、Jump Desktop、Windows App(Microsoft Remote Desktop)、AnyDesk、TeamViewer 和 RustDesk。会话需要在前台的终端或查看器中有一分钟的输入,才会生成报告,因此通过 ssh 的 scp、sftp、rsync、git,隧道(-N、-f),ProxyJump 跳转,单条命令,以及编辑器或智能体在后台运行的 ssh 都不计入。连到这台 Mac 本身的会话(localhost 上的虚拟机或容器)会被跳过。Chrome Remote Desktop 运行在浏览器标签页中,无法与浏览器区分开。Kilobat 从不读取会话内容:它只看到进程、进程所连接的地址,以及它传输了多少字节。

会话打开期间,Kilobat 每秒 ping 一次主机(连接所指的主机自身地址)、互联网和你的路由器,每隔几秒从 macOS 读取该连接自身的 TCP 往返时间,并记下最忙的其他 App、Wi-Fi 和 Mac 的负载,方式与通话报告相同。连续两秒或更长时间 ping 丢失,或 ping 比该会话平常慢 150 ms,就算作一次延迟;对 SSH 和 Mosh 来说,只统计你正在输入的时候。每次延迟都会按通话报告的顺序标出原因:Wi-Fi 登录页面让你退出了登录;其次是其他 App 在上传或下载、你网络上的其他设备(如果是运行 Kilobat 的已配对 Mac,会显示其名称)、Wi-Fi 抖动或信号弱、隔空投送扫描、Starlink、你的运营商或更远处(互联网也同时停顿),或通往主机的路径本身(互联网按时响应,主机却没有)。如果延迟发生在路由器之外,且主机属于 Kilobat 会读取其状态页面的服务(例如 Tailscale),报告会说明该服务何时承认了故障。距离 150 ms 或更远的主机,即使线路干净,也会被指出太远。当主机和路由器都按时响应 ping,而按键却两秒或更长时间没有得到回应时,就是服务器本身太慢;Kilobat 只在这种情况出现两次后才会指出,而且只针对 SSH。不响应 ping 的主机改为测量到互联网的情况,并用该连接自身的 TCP 往返时间来衡量它的距离和进行这项检查。

对于 SSH,当延迟来自 Wi-Fi 抖动、隔空投送、Starlink 或路径,或主机太远、不稳定或丢包时,报告会建议使用 Mosh:它会立即显示你输入的内容,并能扛住丢包和 Wi-Fi 切换。如果原因是某个 App、其他设备、Mac 或服务器,报告就不会建议,因为 Mosh 只会把问题掩盖起来。会话在其进程退出时结束,或在十分钟没有按键后结束(远程桌面为三分钟),报告截止到最后一次输入。报告显示在“健康 › 远程会话”中,Kilobat 见到会话后这一项才会出现;只有出现延迟或卡顿的会话结束后才会发送通知。没有 Pro 时,报告只显示次数;Kilobat Pro 会指出原因,告诉你可以尝试什么,以及 Mosh 何时有帮助。可以在“设置 › 网络 › 远程会话后报告”中关闭报告或其通知。在终端中,kilobat remote 会列出它们(--kind ssh|mosh|desktop),智能体可以通过 get_remote_session_reports 读取。

OBS 直播报告

每次 OBS 直播结束后,Kilobat 会说明是否丢帧、何时丢帧及原因。它通过 OBS Studio 28 或更高版本内置的 WebSocket 服务器(obs-websocket 5)读取数据。在 OBS 中打开“工具 › WebSocket 服务器设置”,勾选“启用 WebSocket 服务器”;然后在 Kilobat 中开启“设置 › 直播 › OBS 直播报告”,填写端口(除非更改,否则为 4455)和 OBS 要求的密码。密码保存在 Mac 的钥匙串中。测试连接会明确显示是否成功,或者 OBS 未运行、WebSocket 服务器关闭、需要密码或密码错误。Kilobat 只连接 127.0.0.1 并请求计数器:它绝不会看到视频、音频、聊天或直播密钥。它不读取 Streamlabs Desktop 和其他直播应用:Streamlabs 有自己的远程控制(端口 59650,使用令牌),其单一丢帧数无法说明丢帧发生在网络还是编码器。

OBS 直播期间,Kilobat 每秒向其请求一次直播状态(网络丢帧,即 OBS 所称的 Dropped Frames (Network)、拥堵数值和已发送字节数)及统计数据(因渲染延迟错过的帧、因编码延迟跳过的帧和 OBS 的 CPU 使用率)。同时,它以通话报告的方式测量线路:每秒 ping 一次互联网和路由器、其他最繁忙的应用、Mac 负载、路由器通过 UPnP 共享时的其他设备流量计数器、已配对 Mac 自身的报告、Wi-Fi 信号、隔空投送、Starlink 天线和 Wi-Fi 登录页面。

每个丢帧时段都会标明原因,网络原因与 OBS 自身原因分开记录。网络方面包括:Mac 上另一个应用正在上传(例如 Dropbox)、网络中的另一台设备、Wi-Fi 或路由器停顿(信号弱或隔空投送是原因时会注明)、Starlink、Wi-Fi 登录页面将你登出、设置的码率高于上传能持续支持的速度,或路由器之外的问题——运营商处或通往接入服务器的路径。因编码延迟跳过帧表示编码器跟不上,因渲染延迟错过帧表示 GPU 跟不上,通常是忙于游戏;报告会说明这不是连接问题。建议取决于原因:将码率降低到上传速度可支持的数值、暂停应用、使用直播通话模式、改用以太网、选择较近的接入服务器、使用更快的编码器预设或硬件编码器(Apple VT H264),或降低分辨率或帧率。

Kilobat 检测到直播后,报告会显示在“健康 › 直播”中,与通话和远程会话并列。只有丢帧达到值得注意的程度时才会通知:丢失至少 0.5% 的帧,或某个时段丢失至少 5%。没有 Pro 时,报告显示丢帧数;Kilobat Pro 会列出每个原因和应如何调整。直播通话模式(Pro)从 OBS 开始直播到结束期间暂缓通话模式会暂缓的应用,包括 Dropbox、Google Drive、OneDrive、Backblaze 等,以及没有游戏位于前台时的 Steam 下载。

直播前检查会判断上传速度能否支持今晚的直播。通过“健康 › 直播”、快捷指令直播前检查或 kilobat stream check 启动后,它会通过单条连接向 Cloudflare 上传约八秒(最多 16 MB),并向 1.1.1.1 发送 20 次 ping,测量抖动和丢包。它读取 OBS 中设置的码率(简单输出模式从配置文件读取,高级模式从配置文件的编码器设置读取)、上次直播的码率或你输入的码率,并进行比较:上传速度应达到码率加 30%。结果显示已就绪;上传速度足以覆盖码率但没有余量时显示较紧张;否则显示不足及合适的码率(上传速度除以 1.3,再向下取整到 100 kbps)。它还会列出当前正在上传的应用。在按流量计费的网络上,它未经询问绝不测量,而是使用该网络上次的速度测试,并注明这一点。检查免费。

在终端中,kilobat stream(或 stream status)显示 OBS 是否已连接、正在直播及目前丢帧数;kilobat stream check 运行直播前检查(--bitrate <kbps> 用于设置,--no-measure 使用上次速度测试,--measure 在按流量计费的网络上仍然测试);kilobat stream reports 列出以往直播。每项都支持 --json。智能体使用 get_stream_reports 和 check_stream_readiness,两者均为只读。请参阅面向主播的 Kilobat。

云游戏

云游戏进行时,Kilobat 按照通话报告测量通话的方式测量会话,结束后说明何时卡顿及原因。它通过应用名称识别 GeForce NOW、Boosteroid 和 Shadow 的 Mac 应用,并在浏览器中识别 GeForce NOW、Xbox Cloud Gaming、Amazon Luna、Boosteroid 和 Shadow。当应用或浏览器自身的流量承载游戏串流时,会话开始:连续十秒,传入 UDP 流量大部分时间至少 2 Mbps,平均 3 Mbps,且为传出流量的四倍。端口 443 上的普通网页视频和大多数双向通话不符合该条件。同一浏览器中其他繁忙标签页可能影响估算。在浏览器中,还必须识别串流名称:Kilobat 从网络过滤器的名称或反向 DNS 中查看浏览器正在连接的主机,寻找服务自身的主机(play.geforcenow.com、xboxlive.com 下的 gssv-play 主机、luna.amazon.、cloud.boosteroid.com、pc.shadow.tech)。无法识别的浏览器串流不会处理,因此没有网络过滤器时,部分浏览器会话不会被报告。它绝不会看到游戏、视频或你的账户。

会话期间,“健康 › 云游戏”显示过去 30 秒的 ping、抖动和丢包(串流服务器响应 ping 时测量到该服务器,否则测量到 1.1.1.1)、根据符合条件的客户端流量估算的串流码率和用量,以及此 Mac 上当前的干扰因素:隔空投送扫描、2.4 GHz Wi-Fi、信号弱,以及大量上传或下载的应用;iCloud 照片、iCloud 云盘、Time Machine 和 macOS 更新会按名称显示。暂停隔空投送和后台传输会暂停隔空投送的连接(免费;macOS 要求输入管理员密码),并在使用 Pro 时暂缓通话模式会暂缓的应用,例如 Dropbox、Google Drive 和 Steam 下载,直到会话结束、你切换到其中一个应用或最多三小时。Apple 的 iCloud 和更新服务不会暂停;卡片会说明如何自行暂停。按流量计费的网络或热点上还会显示当前码率下每小时的流量、按该服务的通常会话时长估算的总量(观察到三次之前按一小时计算),以及此处流量预算何时用尽。

卡顿指连续两秒或更长时间的 ping 丢失或比会话中位数高 100 ms,或者串流码率连续三秒或更长时间低于其中位数的 40%(服务降低了画质);开始的前半分钟和最后几秒不计入。每次卡顿都会记录当时存在的因素:Wi-Fi 登录页面、路由器也停顿时的 Wi-Fi(细分为 2.4 GHz、信号弱、隔空投送和较远的 Mesh 节点)、Starlink 天线、另一个大量传输的应用、网络中的另一台设备,或路由器之外的问题。例如:“21:14 卡顿 40 秒:2.4 GHz Wi-Fi,同时 iCloud 照片正在上传”。没有 Pro 时,报告显示卡顿次数、ping、码率和流量;Kilobat Pro 会列出每个原因和应如何调整。发生卡顿的会话结束后会发送通知(设置 › 直播 › 云游戏报告,以及“会话卡顿后通知”)。最近 200 份报告保存在此 Mac 上。

在终端中,kilobat cloud-gaming(或 cloud-gaming status)显示当前会话,kilobat cloud-gaming reports 显示以往会话,两者均支持 --json。智能体使用只读的 get_cloud_gaming。请参阅在 Mac 上玩云游戏,其中包含 GeForce NOW、Xbox Cloud Gaming、Boosteroid、Amazon Luna 和 Shadow 的页面。

通话模式

通话模式会在你通话时停止那些会让通话卡顿的 App。通话开始时,Kilobat 会暂停正在运行的 Dropbox、Google Drive、OneDrive、Box、Backblaze、Arq、Creative Cloud、种子下载客户端等 App,并拒绝它们的新连接,所以正在进行的上传会立即停止。游戏启动器(Steam、Epic Games、Battle.net)只在下载且没有游戏在前台时才会被暂停,因此游戏和它的语音聊天都能照常工作。通话一结束、你切换到其中某个 App、Kilobat 退出,或最多三小时后,一切都会立即恢复;每次暂停前都会写下一份列表,确保即使崩溃也不会有 App 一直处于暂停状态。Apple 自己的 iCloud 和更新服务不会被暂停。在“设置 › 网络 › 通话模式 › 选择…”中选择要暂停的 App,也可以在这里设置通话期间暂停隔空投送(每次通话开始时,macOS 会要求输入密码)。之后,通话卡片会说明通话模式暂停了哪些 App。通话模式是 Kilobat Pro 的功能。

会前检查

打开“设置 › 网络 › 会前检查”,并允许访问日历一次。在带有 Zoom、Google Meet、Microsoft Teams、FaceTime、Webex、Whereby 或类似链接的日程开始前约五分钟,Kilobat 会花十秒钟检查其他 App 的流量、Wi-Fi、向互联网发送 100 次快速 ping、隔空投送和 Mac 的负载。只有在有东西会让通话卡顿时才会通知你,例如“Dropbox 正在上传,Wi-Fi 信号弱”;使用 Kilobat Pro 时,通知中有一个按钮,可以暂停这些 App 直到通话结束。日历只在这台 Mac 上读取,会议的任何信息都不会被保存或发送到任何地方。

到游戏服务器的 ping

该排哪个区域?在“速度 › 游戏服务器”中打开游戏选择器,搜索你的游戏,然后点按“Ping 服务器”。Kilobat 会向该游戏的每个数据中心各 ping 五次,每次几个,并按 ping 中位数列出,附带抖动和丢包,最近的排在最前面,标为最适合你。2 ms 以内更稳定的区域优先于波动更大的区域。大约需要五秒钟,并且只在你要求时运行。选择器会先列出你最近用过的游戏,再按游玩人数列出所有游戏。

ping 的目标取决于每个游戏在哪里公布或托管服务器,而这个数字始终是你到该区域数据中心的 ping,而不是到你最终进入的对局服务器的 ping,后者可能会稍高一些:

  • Valve 中继,适用于 Counter-Strike 2、Dota 2、Deadlock 和 Team Fortress 2:Valve 在每个数据中心的中继,来自 Steam 为每个游戏发布的中继列表。这些游戏的匹配流量经过这些中继,CS2 自己的 net_print_sdr_ping_times 测量的也是同样的中继。
  • Epic ping 服务器,适用于 Fortnite:Epic 为每个匹配子区域指定的 ping 服务器。如果网络阻止 ping,Kilobat 会改为测量到它的 TCP 连接时间。
  • AWS 区域,适用于 Apex Legends、Dead by Daylight 和 Marathon:这些游戏在 Amazon GameLift 上托管对局,Kilobat 会向游戏使用的每个 AWS 区域中 GameLift 自己的 ping 信标发送 UDP 回显(Apex 和 Marathon 在各自的 Steam 数据中心配置中列出了这些区域)。标签会注明区域,例如“Frankfurt · AWS eu-central-1”。
  • Azure 区域,适用于 Rainbow Six Siege、Age of Empires II、III 和 IV 以及 Age of Mythology:Siege 的数据中心是 Azure 上的 PlayFab 区域,而每个 Age of Empires 大厅都会注明其中继服务器所在的 Azure 区域。Kilobat 会向每个区域的 PlayFab 信标发送 PlayFab 的延迟探测;如果某个区域没有信标(UK West),则测量到该区域 Azure Storage 的 TCP 连接时间。
  • 官方测试主机,适用于 Brawlhalla 和 Hunt: Showdown 1896:Brawlhalla 帮助页面为每个区域列出的 ping 测试主机(它们不响应 ping,所以用 TCP 计时),以及 Crytek 为 Hunt 的欧洲和美国东部区域公布的两个测试地址。

没有公布任何可 ping 目标的游戏会在选择器中列出并注明原因,Kilobat 不会去猜:Valorant 和 League of Legends(Riot 没有公布目标,玩家分享的地址也已不再响应)、Overwatch 2、Call of Duty、PUBG、Marvel Rivals、Roblox、World of Warcraft 等没有公布服务器或区域的游戏;GTA Online、Helldivers 2、Destiny 2 和 Warframe,由玩家做主机;Minecraft、Rust、Palworld 和 Valheim,你加入的是他人运营的服务器;还有 EVE Online,它的地址在 Cloudflare 边缘节点响应,而不是在伦敦。对于这些游戏,请使用“你当前的对局”。

面板顶部的你当前的对局适用于任何游戏。你玩游戏时,Kilobat 会查看前台的游戏,或最近一个在前台的游戏(“游戏”类别中的 App、Steam 库中的游戏,或 CrossOver、Whisky、Wine 中的 Windows 游戏),找出它交换 UDP 数据最多的服务器(不计网页、DNS 和语音通话建立的流量),显示 DB-IP 登记该地址的国家或地区(如果是 Valve 的中继,则显示 Valve 数据中心),并 ping 它五次。很多游戏服务器不响应 ping;这时 Kilobat 会显示“此服务器不响应 ping”,而不是显示丢包。有些游戏从 macOS 未标注地址的连接发送数据,Kilobat 会说明它看不到这些游戏的服务器。

点按用于叠加层,即可把其中任一 ping 放到直播上:叠加层随后每秒 ping 一次该数据中心或你对局的服务器,并在胶囊上显示名称,例如“CS2 · Frankfurt”或“Match · Germany”;对于对局,它每 30 秒重新查找一次服务器。在终端中,kilobat games 列出游戏,kilobat games --game aoe4 输出某个游戏的表格和叠加层目标,kilobat games --match 检查你的对局,kilobat overlay --target aoe4:westeurope 或 --target match 把它推送到直播;智能体使用 get_game_ping。

直播叠加层

在直播中显示实时 ping。开启“设置 › 直播 › 直播叠加层”,然后在 OBS、Streamlabs 或任何直播应用中将 http://localhost:7171/ 添加为浏览器源(640 × 80 已足够)。一个小胶囊显示 ping、抖动、丢包和过去一分钟的折线。默认 ping 互联网(1.1.1.1);可在设置旁边或从游戏服务器中选择路由器、当前比赛或游戏的数据中心,胶囊会显示其名称;URL 中的 server=0 可隐藏名称。开头的蝙蝠在线路良好时呈蓝色微笑,变慢时变为紫色,状态差时呈玫红色皱眉。可在 URL 中更改:?show=ping,jitter,loss,graph,speed、theme=dark、light 或 clear,以及 size=s、m 或 l。使用 Pro 时,brand=0 隐藏文字标志,face=0 用普通圆点替代蝙蝠。开启期间,Kilobat 每秒 ping 一次目标;页面由 127.0.0.1 提供,因此只有此 Mac 可以打开。没有应用时,kilobat overlay 提供相同页面直到按下 Ctrl-C;可用 --target 选择路由器,或使用 match 或游戏区域。要在事后了解 OBS 丢帧原因并在直播前检查上传速度,请参阅OBS 直播报告。