背景
当初看到这个scrcpy工具觉得非常神奇,不知道怎么实现,我对某种业务具体实现特别感兴趣,但我对编程语言没有太多兴趣,对一些用不到算法也特别不感兴趣。后面自己研究一段时间,然后结合scrcpy源代码和其他产品大概实现思路,总结scrcpy 通过app_process实现技术。
技术
- app_process 技术
这个是根本技术,自己实现adb命令功能代码,为什么我们不直接用adb 实现呢?以前一些云控技术用的adb 命令,因为adb 命令会创建进程,对于非常频繁的行为,性能太低。同时跨进程,没有直接源码实现。所以用app_process技术,因为可以通过反射实现adb 代码实现,那你会想我反射不一定要app_process,直接在android 代码反射也可以,反射代码可以写,但没有权限或者说权限不够,模拟点击调用会失败,通过源代码发现他需要系统的权限。如果不走app_process,可以root手机达到反射条件。 - 反射
怎么反射,对于新手完全找不到方向,你看scrcpy代码,你也不知道为什么他们能找到,后面我想既然他们反射实现的adb命令,应该看了android 命令实现代码,果然我在 android 源代码找到有关代码,那么我们方向找到了,只要找命令源代码,那么基本就能反射出来。 - android 怎么编码或者怎么截图
- 反射截图命令
我最开始也是这么想的,反射命令截图,FPS可以达到30帧样子,虽然达不到60fps基本作为协作工具完全可以了 - android h264 编码
- 这个通过编码成h264,获取一个buffer就投递给PC端【直播】
- 这里难点不熟悉android 编码代码,直接自己搜索一下这方便代码,完全写一个直播丢给PC,不用反射,编码直接申请权限,调用代码就可以了。
- 反射截图命令
- 网络通信
- scrcpy用原生socket,然后协议用二进制自定义协议
我觉得不是很有必要,如果真的为什么节约通信大小,直接用protobuf就好了,毕竟动态的varint还是比较节约内存,不过对于简单协议,用什么都可以,我只是提一嘴。
- 我自己用websocket+JSON 来通信
不用自己切包,JSON解析扩展性高,对于命令来说,这一点协议没有消耗无所谓。
- 视频流,直接丢给单独接受视频端口,如果有服务接入,那么考虑东西会多一些。
- scrcpy用原生socket,然后协议用二进制自定义协议
- PC端
- 视频解码
业界ffmepg 开发库,按照官方解码视频就好
- 渲染
- 网页
感觉渲染速度达不到,貌似都是解决mp4 标签来做的,都会缓存,我没有试过,底层解码成图片,然后投递给网页,我最开始截图成PNG,然后给网页,貌似性能不错。
- SDL
scrcpy就是这么写的,我网页慢,也用sdl,只是整个写法完全自己写的,没有借鉴scrcpy,因为他的跨平台而且用纯c,用大量函数指针来模拟面向对象写法,我直接用c++写的 windows代码,用原生win32 没有用任何其他的,mfc,或者 duilib或者其他的界面。
- 网页
- 视频解码
- 业务代码
- 点击实现
- android 反射实现代码
- PC 界面与 手机界面比例,然后计算在android 真实的坐标
- 按键实现
- androi 反射 input 命令代码
- SDL 处理按键操作
- 快捷键处理
要判断什么时候快捷键,什么单独按键,所以这么设计一些业务代码蛮多,我自己重写几次才写好,所以没有相信那么简单。keyup keydown 什么时候处理,什么时候不处理。
- keydown可能够处理连续按键,keyup 不会触发,所以处理单独按键要响应keydown,而不是keyup触发,否则无法实现一个按键一直按着,触发多次逻辑,
- 快捷键处理
- 点击实现
- android旋转
如果我的博客对你真有帮助,那我也稍微欣慰一下。。。
突然想起来,我当初写博客只是想看一下,互联网从0到1链接,感受互联的感觉。目前已经感受到了,发现google搜索带过来量,自己基本没有放过外联。不知道他怎么跑过来的。