抓娃娃机和小米 AI 音箱

娃娃机

最近远程抓娃娃机是个风口,几乎重现了当年百团大战和万众租车的盛况,除了纯粹的抓娃娃送娃娃外,更有抓娃娃送各种价值不菲的奖品,等同于变现赌博 —— 毕竟黄赌毒才能拯救互联网。当然今天我要说的并不是产品形态或者运营策略,作为开发工程师更关注的是其技术实现细节。几家方案提供商的技术方案基本大同小异,PC / Linux / 安卓板子作为主控端,负责娃娃机控制和视频推流,同时和玩家进行实时音视频互动和指令收发,而客户端(iOS,安卓,Web)进行拉流,实时音视频和指令收发操作。这里唯一的问题是:几乎没看到任何基于移动端 Web 的实现方案。

移动端 Web 有着便于分享且获客成本极低的优点,但各方案提供商都不提供,原因无非有两点:一方面,作为整个流程中必不可少的直播推拉流环节,移动端 Web 缺少成熟稳定的方案。HLS 的确可以在各移动端 Web 上稳定运行,但延迟太大,只能作为备选方案。而 RTMP 协议虽然延迟低却需要 flash 支持,在移动端无法实现。另一方面,实时音视频方案在移动端也没有成熟的方案,iOSwebrtc 的支持也是在 iOS 11 之后才加入。

虽然没有方案提供商提供成熟稳定的移动端 Web 方案,但市面上却不乏一些直接通过微信公众号验证登录并直接在微信浏览器中进行抓娃娃机的案例。那么他们是怎么实现的呢?

通过抓包后我们会发现,他们的音视频数据和指令数据都是通过 WebSocket 进行下发,抓包结果如下:

大多数的 WebSocket 响应包都非常规整:大小相似,且都以 FFD8 FFE0 作为开头。稍微 google 一下可知这是 JPEG 的文件头。也就说这种直播方案是通过 WebSocket 通道下发图片,然后通过 jscanvas 上逐帧绘制。通过下载 html 文件中内暴露 player.js 文件 (竟然能够直接下载) 也可以轻松验证上述猜想。这种方案在接收端网络良好的情况下,延迟往往能够控制在 200 ms 以内,可以作为一个代替 hlswebrtc 的劣化方案。而唯一的缺点传输时流量巨大,对用户较为不友好。当然在此基础上也有些优化方案,比如 jsmpeg,但这就不是本文的想讨论的重点了。

小米 AI 音箱

同样是风口的 AI,几乎所有大厂商都推出了自己的智能音箱,googleecho,亚马逊的 alexa,苹果的 homepad,纷纷拼劲全力占领这个风口的入口。小米也是一样,而不同于其他厂家的一点在于,小米在 “智能家居” 方面有大量布局:各种智能开关,感应器,智能网关,万能遥控器,这使得小米 AI 音箱除了常规的一些 AI 使用场景外,更能够作为智能家居的主入口,通过它来控制几乎所有的家电。想想如下场景:周末起来,葛优躺在床上或沙发上,只要动动嘴巴就可以开关电视,切换频道,甚至指挥小米扫地机器人搞定家庭卫生,岂不是美滋滋。

唯一的问题是隐私和安全。一方面,即使是上面说的三家国际大厂,其中一家的智能音箱就曾被爆出存在一直在录音的缺陷(还是特性?),他们尚且如此,很难不怀疑曾经在路由器上进行抓包并修改 404 页面的小米会在保护用户隐私方面能有多少节操,毕竟谁也不希望自己啪啪啪的声音被音箱收集 —— 无论是被某个具体的个人收听,还是作为大数据的一部分喂给所谓的神经网络。另一方面则是安全,大多数家居都会支持从外网进行控制,如远程遥控空调,空气净化器等。一旦被入侵,后果不堪设想。一不小心就会发生 《刑事侦缉档案》(20 年前的电视剧)中的经典案例:丈夫通过控制家中的电灯,煤气,电视制造恐怖气氛,活活吓死有心脏病的老婆。在安全性方面,普通用户更迷信大厂,相信他们有完善的管理制度和深厚的技术积累能够确保安全。而作为程序员则更相信自己所能够掌控的技术和 “公开透明且久经考验” 的开源方案。

所以我更倾向于使用手机作为主入口,通过 Siri 进行所有设备的控制。唯一的问题是所有的小米设备都不支持 HomeKit,需要引入 HomeBridge。为了部署 HomeBridge,又需要台常开的机器。在不考虑树莓派的情况下,只能拿家里的不支持 Docker 的群晖下手,通过各种麻烦的设置下载对应的软件包进行部署。麻烦事一茬接着一茬。

感慨

上面两件事情,一件事我工作中碰到的问题,另一件是生活上想要解决的问题。抓娃娃机这件事上,在大公司做技术基本要求相应人员能够在其领域深耕,成为专业领域的专家。在这种思想的指导下,是很难对这种逐帧 JPEG 模拟直播的方案感冒的:丑陋而低效,即使使用 jsmpeg 的方案仍不够完美。但是有时候反倒是这种快糙猛的方案却能够很及时的解决产品需求。站在用户的角度来看,他也可以愉快地抓娃娃了,基本是双赢。非要说缺点的话,就是浪费了大量的流量,并没有达到最资源的最大化利用。而 AI 音箱这件事,为了达到心目中的安全标准,不得不亲力亲为将必要的环节一点点串联,不知道是做技术人的幸运还是不幸。说幸运是因为基于对技术的了解,不再是不知者无畏的状态而给自己的家庭引入太多不可知的安全隐患。但另一方面又有点进入了国内食品行业从业人员的尴尬境地,对他人的产品有着天然的不信任感,导致在使用技术产品提高平日生活便利性方面裹足不前,又无法轻松破局。