暑假找了个暑假工,没办法人总是要吃饭嘛,Weiney也不例外。亲戚家的小公司想做移动app引流,当然我是完全不懂什么引流,我也就做个打杂的工作。别看我技术一般,在这个不大的公司我还是唯一专业对口的技术人才呢,其他的都是非对口的,这里我要叉会腰😎😎😎
没去过大公司,不知道大公司对于项目的立项是怎么操作的。反正就在上个星期在饭桌上吃饭的时候,老板一拍大腿:“公司现在就是要做app引流,如果有个系统可以一台电脑控制一大堆手机的话那效率应该会提高很多,你说是不是Weiney?”。群控我当然知道啊,以我爱吹牛的性格免不了跟老板侃侃而谈一波。这一吹牛不打紧,老板还以为我是个行家,点名要求我把这个系统研究出来,还给了我两个星期充裕的时间让我尽情发挥。没等我准备介绍一下市场上成熟的实现方案老板就打断了我,“市场上的都要钱,要钱的话我还找你干啥?”😱完蛋,这次怕是玩脱了。
这么大个工程我一个人肯定是搞不定的啦,别说两个星期就算是两年也难。但是我不妨先把需求整理清晰再看看怎么实现,明确需求是首先要解决的问题
- 电脑监多台安卓设备,要求数据的实时性,画面不卡顿
- 电脑控制手机,常规的的点选操作,中文输入操作
- 在群控的基础上加上脚本功能,可以自动化操作设备
听起来就很麻烦,我最开始想的是用Appium来实现。因为Appium也支持多设备连接,通过屏幕截图映射设备屏幕,实现对设备的控制。大致功能都能实现,我简单的尝试了一下发现有很大的弊端。①:屏幕截图延迟太大,一秒最多实现三帧的图像传输,这还仅仅是单设备在线的情况。②:屏幕控制弊端太大,不能很好的支持屏幕点击,文字输入。③:Pyqt5我不是很会用😬,所以这个方案就被我Ban掉了。自己搞不定的东西就上网看看别人怎么搞定的。学习计算机就有一点好处,你想实现的但是又搞不定的东西肯定有人帮你搞出来了。
Scrcpy
大名鼎鼎的Genymobile公司的开源项目,没错号称最快的安卓模拟器Genymotion模拟器也是出自他们家。项目地址:https://github.com/Genymobile/scrcpy。Github stars过万,从这里就可以看出Scrcpy项目的火爆程度。该项目实现了安卓设备的免Root低延迟投屏和远控。免Root是最大的优势啊,市面上大部分的群控系统许要Root权限。但是众所周知现在的安卓设备的Root并不像前几年那样随便找个一键Root就能解决了。现在的设备Root不要太麻烦,Scrcpy这个特性真是直戳痛点鸭。
设备要求:Android 5.0以上(API 21 以上) 操作系统兼容:Windows,Linux,Mac OS三平台通杀,强大到没朋友 本机环境要求:ADB环境支持,也就是说要安装Android SDK
对于Windows操作系统Genymobile还贴心的为我们打包了exe,我们只需要下载使用就好了,可以说是极其方便了。这里用Windows客户端进行演示。使用Scrcpy要求手机打开开发者模式和USB调试。可以在shell中使用adb devices
查看当钱电脑连接的设备。对于Windows平台的Scrcpy直接启动exe的话只能映射一台设备,如果电脑连接设备超过一台的话就会报错。这种情况我们需要通过shell控制台用指定的命令启动设备,scrcpy --serial [设备名称]
或 scrcpy -s [设备名称]
。
控制设备不但可以通过鼠标点击屏幕实现,对于系统按键的话Scrcpy同样给我们提供了键盘快捷键,几乎可以实现对设备的完全控制。快捷键代码见下图。
总之Scrcpy就可以实现我老板需要的功能,跟市面上的群控系统肯定是有差距,但是贵在免费不是?该项目是基于C语言的,研究透原理之后就可以根据自己的需求进行重置。Python写GUI实在不是很方便,还是建议用C#或者C++。但是不同语言都有相应版本的拓展,感兴趣的可以研究一下。
QtScrcpy
基于Scrcpy实现的带图形界面的安卓投屏,技术栈用到了C++和QT。项目地址:https://github.com/barry-ran/QtScrcpy。可以通过USB和WiFi连接安卓设备,因为作者做了封装并且打包了ADB环境,所以可以直接运行软件。作者描述说软件硬编码只支持十六台设备,但是如果机器支持的话可以修改源码自己打包。
基于本项目作者还开发了相应的配套视频,当然视频是收费的如果有需要并且有学习C++的QT编程的话可以了解一下。课程地址:https://blog.csdn.net/rankun1/article/details/87970523。还有一个重要的功能就是QtScrcpy支持屏幕录制保存,这个也是源项目没有作者自己开发的,有兴趣可以了解下。
Naive-Scrcpy-Client
这个是一个国外大佬做的扩展,是基于Python的Scrcpy支持。需要用到FFmpeg支持,但是目前只实现了投屏功能,控制功能暂未实现。和作者沟通了一下,作者说当前代码已经实现了他的所有需求所以暂时不会有功能更新。但是我个人觉得如果可以封装成一个Python轮子的还估计响应肯定很强烈,毕竟在这一块Python还没有很好的支持库支持。也希望后续作者能够继续完善项目。项目地址:https://github.com/LostXine/naive-scrcpy-client。
写在最后
底层大神已经帮我们开发好了,剩下的就要靠我们自己去完善了。Scrcpy的原理很简单,就是通过一个APP在手机端建立一个sock服务器,然后本机不断地sock获取并将数据流转化为相应的视频流。几乎所有的项目都是选择FFmpeg。自己造轮子以我的水平还真是有点困难,这几天抽空用PyQt写一个图形界面实现GUI创建设备投屏,这个应该不难,主要是要看看Qt怎么用,都是从头开始😓😓😓
当我吧投屏效果展示给老板看的时候,他首先肯定了我这段时间的辛勤工作,随即表示公司现在规模还不适合搞这种项目,让我老老实实研究其他渠道引流,所以这个东西就搁置在这了???
hh
怎么实现的呀,把那个scrcpy投屏放到自己前端页面
Weiney
这个我已不清楚,但是既然能把桌面作为视频源输出的话,将视频源通过相关协议输出到Web前端也是可以实现的