浏览器工程

屏幕捕获轨道生命周期:ended 之后必须清理什么

围绕 getDisplayMedia、MediaStreamTrack ended、replaceTrack、系统停止、源窗口关闭和连接丢失,保持发送方与观看方状态一致。

好的实现不会依赖用户反复刷新碰运气,而会让每个阶段有明确输入、输出、超时和终态。 用户可从系统共享条、浏览器工具栏或关闭源窗口终止捕获,应用按钮只是其中一条路径。轨道 ended 是最终事实,处理器必须幂等完成通知、解绑和资源释放。

浏览器能力由版本、权限、页面可见性和设备策略共同决定。实现需要能力探测与可解释降级,不能把某一台开发机上的 API 存在当成产品契约。

先定义系统契约

这项能力横跨客户端、网络与服务端,局部最优很容易制造全局故障。工程决策需要同时约束两端行为、持久化事实和运维预算。

  • 为每次捕获分配 share session ID,ended 回调只结束所属会话。
  • 停止时先更新终态,再 replaceTrack(null)、停止所有轨道并通知观看方。
  • 重新选择源创建新轨道与新版本,旧轨道迟到 ended 不得停止新共享。

屏幕共享终态由轨道与会话共同决定。所有停止入口汇入同一幂等清理函数,旧回调再晚也不能影响新捕获。

哪些情况会破坏契约

边界条件会把隐藏假设变成真实事故。弱网、刷新、并发和容量上限必须组合测试,因为单独出现时它们往往都能被重试掩盖。

  • 只监听应用停止按钮,系统停止后发送方 UI 仍显示正在共享。
  • 多个轨道共用一个全局 ended,音频结束错误终止仍正常的视频。
  • 观看方刷新后没有会话对账,发送方长期保留无观众的编码任务。

如何逐条验证契约

发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。

  1. 从应用、浏览器工具栏、源窗口和权限撤销四条路径分别停止。
  2. 快速切换两次共享源,延迟触发旧轨道 ended,确认新会话保持。
  3. 观看方刷新、断网和正常退出时核对观看人数、轨道和发送端提示。

完成并不等于主路径跑通,而是每个终态都能对账、每个自动动作都受用户意图约束、每个成本都有明确上限。

把方法变成一次真实连接

打开 uCopy,让两台设备在浏览器里安全连接并开始传输。

开始免费使用