多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

LiveKit 拆解 Safari 下 AV1 黑屏的兜底链路

LiveKit 拆解 Safari 下 AV1 黑屏的兜底链路 LiveKit 拆解 Safari 下 AV1 黑屏的兜底链路【免费下载链接】livekitEnd-to-end realtime stack for connecting humans and AI项目地址: https://gitcode.com/GitHub_Trending/li/livekit用 Safari 进会远端画面是一块黑屏或者自己的摄像头根本推不出去——十有八九是 AV1 编解码没谈拢AV1比 H.264 省带宽的下一代编码。LiveKit 在服务端解决这个问题每次连接建立前它按浏览器和版本算出一份按客户端定制的配置命中 Safari 就把 AV1 从可协商名单里拿掉。下面拆解这条降级链路并给出一套本地跑起来验证的方法。为什么 Safari 偏偏不认 AV1Apple 对 AV1 的支持是碎片的。解码端只有较新的 Apple Silicon 系统有硬解老的 Intel Mac 和低版本 iOS 要么解不了要么退回极慢的软解编码端 Safari 更为保守。与此同时新版 Chrome 和 Edge 的 WebRTC 栈早已把 AV1 默认打开。同一房间里混坐时SFU 给 Safari 参与者选中了一条 AV1 轨道或客户端 SDK 自己把 AV1 塞进 SDP offer黑屏就来了——有声音、没画面日志里还能看到收包正常。这像会议室投影仪只留了 Type-C 口而讲者笔记本只有 HDMI 线不提前查兼容、插上转接头大屏就是黑的。所以这件事不能靠客户端各自自报家门服务端得在协商开始前就按客户端特征把名单改好。一次连接里 LiveKit 偷偷做了什么先摸清客户端底细SDK 发 Join 请求时带着 ClientInfobrowser、browser_version、sdk、os、device_model、protocol 等字段俱全服务端拿到就解析。pkg/rtc/clientinfo.go 里有一个isSafari()判定它驱动一串行为开关Safari 不做 Audio RED 冗余、不复用 transceiver。这是第一层适配作用于行为级。按脚本规则算出编码黑名单第二层在编解码级。pkg/clientconfiguration/conf.go 里放了一批静态规则条件写成 tengo 脚本表达式c.browser safari命中后产出一份把 AV1 列进 DisabledCodecs 的配置另一条规则在 Safari 版本大于 18.3 时再关掉 VP9 的发布端候选还有精确到机型、以及Firefox Linux/Android组合的规则。匹配引擎逐条执行命中的结果按顺序合并输出唯一的 ClientConfiguration。把降档名单塞回 Join 响应pkg/service/roommanager.go 里GetConfiguration(pi.Client)取出这份配置挂到参与者参数ClientConf上随后随 Join 响应下发。SDK 按名单行事发布不再 offer AV1订阅也不选 AV1 轨道SDP 里只剩 H.264、VP9、VP8 这类候选。黑屏路径在首帧推出去之前就被掐断。跑起来三步在本地验证 AV1 降级第①步 拉下来git clone https://gitcode.com/GitHub_Trending/li/livekit cd livekit第②步 复制样例配置cp config-sample.yaml config.yaml要关注的参数只有几个rtc:段控制传输与协商策略服务端默认的编码候选列表含 AV1定义在 pkg/config/config.go。Safari 的降级不依赖改这份配置保持默认即可。第③步 启动go run ./cmd/server同一房间让 Chrome 和 Safari 各连一路观察 Safari 那侧的协商结果编码名单里没有 AV1画面正常亮起。Safari 客户端进房后不会再出现有声、黑屏。因为第一帧推出去之前服务端已经换掉了它的可协商编码。要给其他浏览器或机型加规则照 pkg/clientconfiguration/conf.go 的规则格式补一条 match 表达式即可字段语义以 livekit 协议的 ClientInfo 定义为准以仓库当前实现为准。【免费下载链接】livekitEnd-to-end realtime stack for connecting humans and AI项目地址: https://gitcode.com/GitHub_Trending/li/livekit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表