这一周过的是够有意思的,先停两天电,然后感冒了,然后项目出Bug了,然后发烧了,呵呵哒,赶紧只能过来写点东西压压惊。鉴于最近正好在研究Android投屏及反像控制和Android双开的技术原理,本周就先写写Android投影以及反向控制的原理了。

1 目标

  • Android投影屏幕到电脑
  • 电脑端反向控制Android手机(如QQ,微信,淘宝...)

2 背景

最近在项目小组中遇到一件事,小组有时候需要演示demo供大家参考,当演示Android手机投屏时,就需要借助第三方软件进行投屏,比如说360手机管家的演示功能还有一个神器Vysor(通过Google浏览器投屏并控制手机),但是随之也会带来问题,通过反编译Vysor的Apk可以看到它是使用adb命令截屏然后通过Async网络库传输屏幕投影给后台,既然有网络操作,如果是公司比较重要的东西,万一第三方在后面偷偷保留了演示录屏(我相信这些应用应该都不会,有职业操守),然后可能就会有自己去做投屏的需求。

3 预览图

今天写的原理都是经过本人实现过的,目前PC端已经正常工作,并且可以投屏多台Android。Web端通过node.js websocket webrtc HTML实现的目前还在开发中,鉴于之前没怎么用过前端,所以写的比较慢。

目前测试实时投影在真实机上还可以。
PC端的动态截图如下。

时间.gif

p2

地图.gif

4 原理图

原理.png

5 投屏

投影屏幕,可以去传输图像也可以去传输视频,具体使用哪一种就去看你的需求。而投影图像又分为通过ADB命令去截取图像以及通过Android的ImageReader获取图像然后通过网络传输两种方式,所以投屏的实现是有很多种的,你想使用哪一种都是可以的。

图像流

现在的产品看到他们都是借助手机连线到电脑端的,通过adb直接去截取图片,这样的话就会很快,如果你只是在公司内部用,使用公司的局域网进行通信我觉得也已经够用了,因此也可以实现通过网络Socket直接去传输图像的字节码。但是现在手机分辨率可高了,因此如果你不对图像进行处理直接通过Socket传输的话那么会让PC端投屏变得很卡,因此AndroidClient可以先对图像进行压缩裁剪之后再去传输。

Android端这块我是开启了一个Service,然后通过ImageReader获取屏幕的图像,之后对图片进行裁剪压缩之后再利用Socket传输图像数据信息。其中的基本代码流程如下:

virtualDisplay = mediaProjection.createVirtualDisplay("MainScreen",width,height,dpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,imageReader.getSurface(),null,screenHandler);imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader imageReader) {Log.i(TAG, "call onImageAvailable");try {//如果有图片那么就获取img = imageReader.acquireLatestImage();if (img != null) {//图像处理//send 数据}}}

视频流

起初我采用的就是图片传输,后来想想其实还是有其他方案的,其实可以通过获取Android手机的屏幕视频流通过H264进行编码进行传输给后台Server,这样可以让画面显示的更加流畅。Android Client里面有一个MediaCodec的类以及VirtualDisplay类可以去读取Android的屏幕流,然后转化为H264视频流。

Android端依然是开启一个Service去获取屏幕流,但是编码H264时会有一个坑,就是需要你去手动加入SPS和PPS,之后才是视频帧。此处的处理代码如下

//1,get SPS and PPS
MediaFormat outputFormat = codec.getOutputFormat();
ByteBuffer sps = outputFormat.getByteBuffer("csd-0");    // SPS
ByteBuffer pps outputFormat.getByteBuffer("csd-1");    // PPS
//2, change ByteBuffer to byte[]
...
//3, send byte[] to server by socket
...

6 反向控制

PC端去控制手机有如下两大块技术:

  • Android通过USB数据线或者Wifi连接打开ADB,通过本地执行ADB command
  • Android手机root掉,通过Android客户端执行ADB command

Adb连接方式有如下两种:

  • Usb数据线
  • Wifi: adb tcpip 5555, adb connect android_ip_address

PC应用程序:
Server端的代码主题逻辑不复杂:通过Socket接收Android 客户端传过来的图像数据信息解压缩显示到Ui上面,当用户点击UI时获取鼠标点击的坐标,通过比例换算转化成实际Android真机的坐标,之后通过ADB执行对应的Command命令,然后Android图像的变化再通过Socket实时传输给Server端记住坐标系变化不要忘记了,一开始我忘记了转化坐标结果显示就不对。

当然PC端也可以读取Android Client端的H264编码视频流,然后PC端使用FFMPEG这个库去解码,关于FFMPEG库的相关使用,我推荐大家去看看雷霄骅的技术博客,此人在音视频方面给予大家很大的帮助。

Web应用程序:
首先通过在node.js上通过socket获取Android Client端的H264视频流,然后通过WebSocket实时将字节数组传输给WebRtc,通过WebRtc的video标签去显示,题外话:WebRtc也是个好东西,你可以基于它去做很多有意思的东西比如网络视屏以及现在挺热的Android直播,程序员去多折腾折腾还是很有意思的。之后通过js获取鼠标点击的坐标事件,之后的操作和PC很相似了,都是得到命令然后执行,然后AndroidClient再投屏图像,如此循环。

这大概就是屏幕投影的原理了。并不复杂。关键你要有一颗折腾的心。最近准备把Web端的这块实现完了就来写一篇双开的原理实现。欢迎其他程序员一起入坑一起交流,不管你是学习Android的还是后端的还是前端开发的,都欢迎大家一起交流原理思想,一起学习,一起进步。
还有本人写博客并不多,所以语法表述之类的还尚待提高,而且今天写的时候烧还没退头一直很懵,还请见谅,欢迎大家提出其他的实现想法以及意见。
也喜欢你可以加入QQ群大家一起交流交流:94839608

这是我一开始写的最基本的Android屏幕投影以及反向控制代码,里面很多代码都是硬编码进去的,可能需要你们手动改一些IP或者通过Socket去传输屏幕宽高之类的,毕竟只是基本测试使用的。这是链接
http://download.csdn.net/detail/zhangkai1992/9809903
最近换了工作方向,我还是很喜欢Android的,不过不是我最喜欢的,不过我还是有空会去研究研究Android的。

Android屏幕投影及反向控制原理相关推荐

  1. android屏幕投影到pc

    需要两个工具: 1.android发送端apk,下载地址:http://download.csdn.net/detail/hhbbeijing/9557661 2.pc接收端,mac下载地址:http ...

  2. android 投影ios,五种良心屏幕投影软件,将Android和iOS投影到大屏幕

    随着智能手机的普及,越来越多的人习惯于在手机上观看照片和视频,在会议中显示资料或玩手机游戏. 在玩手机游戏时,小于计算机大屏幕的视野已成为最大的限制,因此许选择使用投影软件将手机屏幕投射到计算机或电视 ...

  3. 用802.11n 加速,将android手机屏幕投影到win7电脑上

    在做Android应用开发的时候,经常需要将已经完成的应用展示给一同开发的小伙伴,然而一直感觉没有找到一种十分方便的办法.特别是看到了开发IOS的小伙伴在做展示的时候的方便.因为Apple既做PC,也 ...

  4. android广播内容显示在屏幕上,如何将手机屏幕投影到计算机显示器上?

    该屏幕广播应用程序摆脱了电缆的束缚,可以将手机的内容投影到电视中的空白空间,以便您可以在电视侧更好地欣赏自己喜欢的视频和图片. 一方面,它用于工作,另一方面,用于家庭生活和娱乐. 实际上,有时无法很好 ...

  5. VR眼镜连接android设备,如何将VR眼镜的屏幕投影到计算机或电视上?

    文字/挪威森林 尽管VR眼镜的目的是让玩家沉浸在虚拟世界中,体验从不同角度观看视频,玩游戏或成为人生的胜利者.但是总有一些玩家希望与他人共享虚拟世界的图像,因此,我现在要提到的是"投影&qu ...

  6. android 使用asm.jar将android手机屏幕投影到电脑上

    使用asm.jar将Android手机屏幕投影到电脑 有时候可能需要将手机上的一些操作投影出来,比如一些App Demo的展示等.其实,有专门的硬件设备能干这件事儿,但没必要专门为展示个Demo去花钱 ...

  7. 基于Scrcpy的Android手机屏幕投影到电脑教程

    基于Scrcpy的Android手机屏幕投影到电脑教程 文章目录 基于Scrcpy的Android手机屏幕投影到电脑教程 一,前言 二,具体步骤 1.软件下载 2.环境配置 三,基于Scrcpy的手机 ...

  8. Mac Android 屏幕同步/共享投影工具[Vysor]

    Vysor是一款将Android画面投影到桌面的Chrome插件,最大的优点是快.轻,支持Mac.Windows.Linux平台. 安装也很简单: 1.打开Chrome 网上应用商店,搜索Vysor, ...

  9. android手机连接windows,将Android手机投影到Windows 10 PC [夏昆冈]

    Windows 10 预览版Build 14328加入了原生的Miracast投影功能,简单说,任意加入无线网络的Win10设备都可以成为一台无线显示器设备.这样一来,几乎所有Android手机和Wi ...

最新文章

  1. Android 串口通讯 获取卡号
  2. Apache 基金会宣布 Apache Pulsar 毕业成为顶级项目
  3. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  4. Cydia for Android2
  5. extern的关键字用法(C# 参考)
  6. SpringMVC拦截器-用户登录权限控制代码实现1
  7. web压力测试之siege
  8. eclipse创建maven多模块项目(单个类似)
  9. Android下载apk异常java.net.SocketTimeoutException: timeout解决办法
  10. 轻量级数据sqlite的C++调用示例
  11. 【设计模式】设计模式六大原则
  12. 【scrapy windows环境下安装遇到的问题】
  13. java 允许魔术变量_PHP超级全局变量、魔术变量和魔术函数汇总整理
  14. SQL的导入excel数据
  15. 硬盘镜像和软盘镜像中内容的查看方法
  16. 永磁同步电机的原理介绍
  17. 几分钟,就看到人性的几个面孔
  18. python linux区域截屏,用Python写一个像QQ可快捷键唤起区域截屏的应用
  19. ios 纯代码怎么适配ipad_关于ios 适配ihone 和 ipad方式
  20. 高数篇:02费马定理

热门文章

  1. 吐血推荐珍藏的IDEA插件
  2. 广西来宾中考计算机考试考什么,2018来宾中考科目及分值
  3. 忘记网报序号_中考报名序号忘了怎么查询
  4. USB-C小家电时代,筋膜枪、游戏手柄、智能台灯等如何实现USB-C接口?
  5. 脑电参考之零参考技术
  6. 推荐几个优秀的开源的项目
  7. 【AI论文精粹】透明度图灵测试;尖峰神经网络;NodePiece;脑电解码方法
  8. Odoo与浪潮合资研发PS Cloud之如何设置Odoo库存?
  9. 阿里云万网域名一键签发SSL证书 快捷申请免费SSL证书教程
  10. Akelpad 4.7.3 汉化版