我们机房靠东墙立着一排钢架,上面用魔术贴挂着三十七台退役手机和旧平板,同事管它叫"旧机墙"。每回播放页改版,我都得拿张表从左上角开始一台台点名,这个动作在摄行科技已经重复了四年多。这篇就把墙上的机器挨个盘一遍,讲清楚直播端兼容性在真实项目里会以什么形式炸开,以及我们最后凭什么把三十七台砍到十二台。
先把话撂前头:设备不是越多越好。测四十台的团队往往比测对十二台的团队漏得更多,因为机器一多,点名就变成走过场,最后每台都只是"能出画面"就打勾。
这面墙是怎么攒起来的
墙上没有一台机器是买的。有的是同事换新机后扔在工位抽屉里的,有的是客户前台淘汰的签到平板,还有两台是去年在华东某制造园区做年度大会时,客户 IT 部门直接从库房搬给我们的——车间班组长人手一台的三防机,屏幕上还带着油污和一股淡淡的切削液味。
每台机器贴一张标签,写系统版本、内核版本、入库日期、历史故障编号。最老的一台是 Android 7.1 的备用机,屏幕边缘已经泛黄;最新的一台反倒是前年 11 月才上市的旗舰,它凭什么进墙,后面单开一节说。
这面墙对我们来说不是摆设,是直播端兼容性的物证库——每一条标签背后都对应过一次真实的线上投诉,谁也没法拿"理论上应该没问题"来搪塞。
点名头两排:安卓内核各行其是,苹果固执得统一
外行以为安卓上都是 Chromium,实际比这乱得多。同一个 Android 12,A 厂内置浏览器是 Chromium 94 魔改,B 厂是 99,C 厂干脆套了一层自研壳,UA 里明晃晃写着 Chrome/108,但 MSE 的实际行为跟 108 对不上。你按 UA 做能力判断,等于把自己送进坑里。
第一排八台安卓机,标签上的历史故障我照抄几条:两台在低延时 HLS 下跑二十来分钟音画渐进失步,音频快约 0.8 秒;一台不认 fMP4 封装的 HLS,只能回落到 TS 切片;一台切清晰度必崩,崩溃点卡在 SourceBuffer 的 remove 调用上;还有一台横屏全屏后系统状态栏压住画面右侧约 4.2% 的区域,纯样式问题,可客户投诉起来最凶。
这排机器教会我一件事:判断能力要用特性探测,别信 UA。播放器初始化时实打实地问一句"这个 codec 串你支不支持",比解析一百行 UA 靠谱。
第一排放回架子,转到第二排四台苹果设备,最老的是 iOS 12 的小平板。苹果的好消息是内核统一,坏消息是它统一得极其固执——iOS 上所有浏览器底层都是 WebKit,装个别家浏览器再试一遍纯属浪费时间。
真正的分界线是系统版本。早期 iPhone 上 MSE 压根不可用,只能吃原生 HLS;直到 iOS 17.1 引入 ManagedMediaSource,iPhone 端才有了一条可用的 MSE 通路。这条时间线直接决定降级策略怎么写。相关的状态机行为建议对着 W3C 的 MSE 规范 逐条核,规范对 SourceBuffer 各状态的描述比任何二手教程都准。
企业微信和钉钉的内置浏览器才是直播端兼容性的重灾区
企业直播八成以上的观众不是从系统浏览器进来的,是从办公 IM 的消息卡片点进来的。那是一个被产品经理改造过无数次的 WebView,行为跟外面完全两码事。
墙上第三排专门放这类环境的测试机,踩过的坑集中在四处:内置浏览器普遍禁用带声音的自动播放,首帧起来了但没声音,用户以为直播没开;部分版本的全屏 API 被接管,调 requestFullscreen 无响应,得改用 CSS 伪全屏;某些内核对 Range 请求的缓存策略很激进,切片重复拉取导致流量翻倍;还有分享出去的卡片会二次跳转,URL 上的 token 参数被截断,观众打开就是鉴权失败。
这些问题在系统浏览器里一个都复现不了。所以我们的规矩是:只要客户主用某个办公 IM,那台装了对应版本 IM 的机器必须进最小测试集,不能拿系统浏览器的结果糊弄过去。首帧这块的联动优化,我们在直播首帧秒开是怎么做出来的里拆得更细。
HLS 还是 flv.js,这个分歧要多花六台机器
技术路线的分歧会直接体现成测试机数量。走 HLS,苹果端省事但延迟通常在 6 到 9 秒,低延时模式又把安卓端的兼容面积扩大了;走 flv.js,延迟能压到 2.4 秒上下,但它依赖 MSE,苹果端老系统直接出局,得准备一套 HLS 兜底。
两条路都要保,直播端兼容性的测试面积就等于两套方案的并集,这也是墙上机器数量下不去的主要原因。我们的做法是按客户观看端画像来砍:内网办公场景以桌面端和 IM 内置浏览器为主,重 flv.js 轻 HLS;面向经销商、代理商的公开场,移动端占比常年超过七成,那就反过来。
顺带说一句,并发人数的统计口径也会被播放路线影响,同一个观众在两条链路上可能被数两次,这个坑在直播房间的并发人数是怎么统计出来的里有专门一节。
自动播放策略:黑屏投诉里有一半栽在这
去年 11 月中旬的一个周四下午两点半,一场面向渠道商的产品发布会开播十二分钟,客服后台涌进来六十来条"打不开""黑屏"。我当时脸都绿了,切到监控一看,推流、转码、CDN 全绿。
最后定位到的原因特别憋屈:客户市场部临时把落地页换成了自己做的新版,页面上少了那个"点击进入直播间"的遮罩层。浏览器的自动播放策略要求带声音的媒体必须有用户手势,没有手势就直接被拦下,播放器 play() 返回的 Promise 被 reject,页面上什么都不显示。这事儿真挺离谱的——一层遮罩没了,整场直播在移动端等于没开。
这种事算不算直播端兼容性问题?我认为算,而且属于最难在办公室复现的那一类——代码一行没改,页面被人换了,浏览器策略就把你拦在门外。从那以后摄行科技的播放页模板里,那层遮罩是写死在框架里的,谁也改不掉;同时把 play() 的 reject 分支接上兜底 UI,静音起播加一个大喇叭按钮,起码画面先出来。
低端机的解码天花板是硬的
有些兼容性问题不是软件能绕过去的。墙上最下面那排四台是纯低端机,1080p60 的流进去,解码线程直接跟不上,画面掉到十几帧还伴随音画不同步。这不是播放器写得烂,是芯片的硬解规格摆在那儿。
我们的处理方式是让服务端多出一路 720p30 的低码流,客户端探测到解码持续丢帧就自动切过去。判断依据别用机型黑名单——机型太多了,维护不过来。用连续三个统计周期内丢帧率超过 8.5% 作为触发条件,实测比黑名单准得多。这套自适应思路和远端画质的挽救逻辑是相通的,远程连线嘉宾的画质怎么救回来里写过完整的降级链路。
直播端兼容性的最小测试集,十二台够不够
盘完三十七台,我们把真正有区分度的组合抽出来,做成了下面这张表。四年下来它覆盖了统计口径里 91.3% 的实际观看设备,剩下不到 9% 用兜底策略接住。
| 序号 | 设备/环境 | 系统与内核 | 主要盯什么 |
|---|---|---|---|
| 1 | 安卓中端机 | Android 10 / Chromium 8x 魔改 | fMP4 支持、清晰度切换 |
| 2 | 安卓中端机 | Android 13 / Chromium 11x | 低延时 HLS 音画同步 |
| 3 | 安卓旗舰 | 最新版本 / 最新内核 | 新特性回归、权限弹窗 |
| 4 | 安卓低端机 | Android 11 / 入门芯片 | 1080p60 解码丢帧率 |
| 5 | 三防工业机 | Android 9 / 老内核 | 弱网重连、字体渲染 |
| 6 | 旧款平板 | Android 8 / WebView 独立更新 | WebView 版本与系统解耦 |
| 7 | iPhone 次新 | iOS 17+ | ManagedMediaSource 通路 |
| 8 | iPhone 旧机 | iOS 15 | 原生 HLS 回落 |
| 9 | iPad | iOS 14 | 横竖屏与画中画 |
| 10 | 办公 IM 内置浏览器 A | 随客户版本 | 自动播放、全屏接管 |
| 11 | 办公 IM 内置浏览器 B | 随客户版本 | 分享跳转与 token 截断 |
| 12 | 桌面端 | Windows + 主流浏览器双版本 | 多窗口、硬件加速开关 |
这张表不是抄来的通用清单,是三十七台机器挨个点名点出来的减法结果。每上一个新项目,摄行科技会按客户的观看端画像替换其中一到两行,比如客户主力终端是国产化桌面系统,第 12 行就换成对应环境。剩下十一行属于长期不动的基本盘,动它需要有新的故障记录做依据。
为什么最新旗舰机反而经常先出问题
这可能是最反直觉的一条:墙上那台前年 11 月上市的旗舰,是所有机器里报障次数最多的,比 Android 7.1 那台老古董还多。
道理并不复杂。新旗舰跑的是最新内核,浏览器厂商正在收紧的策略、刚废弃的旧 API、新加的权限弹窗,都是先在它身上生效。老机器反而稳定——它的内核已经冻结好几年了,行为固定,你摸清一次就一直有效。真正会突然变的,永远是最新的那一头。
所以我们的最小测试集里必须留一台"永远最新"的机器,而且它要在每次系统大版本更新后重新跑一遍全量用例。把直播端兼容性理解成"照顾老设备"是不完整的,它同时是"盯住新变化"。
直播端兼容性该怎么变成一条流水线
点名不能只在上线前做一次。摄行科技现在的做法是拆成三段:开发阶段跑自动化的特性探测脚本,输出一张能力矩阵;提测阶段人工过一遍十二台最小测试集,每台限时八分钟,超时说明有坑;正式开播前两小时,用现场网络再跑三台代表机——网络环境变了,很多问题才会露头。
验收环节要把这些写进条款,否则出了问题扯皮没依据。哪些项该进验收单,我们在直播项目验收标准该写哪几条里列过模板。行业侧的技术要求,中国通信标准化协会公开的音视频服务相关文件也值得对照着看,写方案时引用比自说自话有分量。
最后聊聊成本。很多人担心搞这一套很贵,其实旧机墙本身几乎零成本,全是回收来的;真正的投入是人,一轮完整点名两个人大概两小时四十分钟。而一场三百人规模的直播因为兼容性问题中断重来,光是重新组织观众的沟通成本就远不止这个数。
如果你手上有直播项目还没做过系统性的端侧验证,把观看人群的终端画像、办公 IM 类型和预计并发发给摄行科技,我们可以按你的实际情况出一版最小测试集清单,也能安排真机实测出报告,需要的话还能去现场做一次开播前勘测。这块摄行科技一直是免费出方案的,先把风险摸清楚再谈报价。
#摄行科技