怎样才能做到一台手机同时观看多个监控没有画面画面?

奥创软件研究院推出的奥创微群控让越来越多的人了解到了电脑控制手机的操作。自奥创软件研究院首家发布电脑批量控制手机的解决方案以来,有很多人开始探讨电脑控制手机技术在实际工作中的应用。
由于市场太大,仅靠奥创软件研究院一家也是做不过来的,现在将手机屏幕投射到到电脑的技术原理,以及一台电脑批量控制多台手机的技术(即所谓的手机反响控制)简单的给大家介绍下,在此抛砖引玉,希望能给大家一些思路上的指导。
说到安卓手机的屏幕投射,就不得不说安卓的adb,ADB的全称为Android Debug Bridge这个相当于是电脑与手机连接的桥梁,目前几乎所有电脑对手机的控制,都需要用到安卓的adb 组件。所有的控制都是通过电脑向ADB 发送指令来执行,通过adb来实现对手机控制。
手机屏幕投射到电脑的话,就要涉及到安卓系统底层的一些东西,安卓5.0 以上系统有提供官方的屏幕投射接口,以下版本,就要程序员自己来写一些底层的代码来实现,目前奥创软件研究院用的将手机屏幕投射到电脑桌面的技术是用c语言配合java 以及.net来实现,云端使用php语言来编写。
目前市场上的电脑控制手机的软件,一般都在30台以下,因为传统的adb有限制,在windows环境下一般超过17台就会出现连接不稳定的情况。
一般程序员经过对adb的反编译重写,可以实现在windows环境下实现一台电脑同时投射40台手机的屏幕。
但是要想达到同时投射127台手机的屏幕,那么就需要骨灰级程序员了,对c语言底层研发,以及安卓系统底层,都要有深入的研究。
为什么是127 个呢?因为电脑硬件当时设计考虑的最大USB 接口数量就是2的8次方个,也就是128 个,而本身自己要占用一个,所以一台电脑的硬件极限理论上只支持127个USB 接口。
下图是奥创软件研究院最初的研发环境,一台电脑同时控制100台手机的应用场景。
PS:当时最早测试电脑控制手机用的是用天语手机,后来已兼容了大多数安卓手机,安卓4.4 以上的版本,几乎都可以使用,这个场景的图有很多不同版本被大家疯狂传播,但是很多人都不知道源头在哪里。
奥创微群控目前有多种控制方案,有windows低端版本,也有linux服务器高端版本,除了有一台电脑控制多台手机的基本控制和屏幕投射以外,还为不通行业增加了一些实用的营销功能,还可以实现对其他各种APP的控制。每个版本都将技术发挥到极致,每一项功能细节都深入研究。
对一般人来说,开发出来一台电脑控制多台手机的软件,还是很有难度的,但是对于奥创软件研究院而言,是比较简单的。因为对各方面的技术都有深入研究,所以可以快速开发出需要的功能。
目前,奥创软件研究院将计划逐步开放电脑控制手机的底层技术,逐步提供一些接口给大家,并与大家一起研究探讨电脑控制手机更深层次以及更广范围的应用,也希望广大程序猿一起贡献自己的力量,一起将电脑对手机的控制做到极致。
阅读(...) 评论()9851人阅读
Android(8)
一直想在自己的Android手机上实现一个手机监控摄像头功能。今天逛论坛,看到一个例子,于是做了出来,留着以后完善。
1。Android和PC通过socket通信。
2。Android下Camera的使用。
package com.wenix.
import android.app.A
import android.app.AlertD
import android.app.AlertDialog.B
import android.content.DialogI
import android.content.DialogInterface.OnClickL
import android.content.I
import android.os.B
import android.view.W
import android.view.WindowM
import android.widget.EditT
import android.widget.TableL
public class GetIP extends Activity {
String ipname =
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
final Builder builder = new AlertDialog.Builder(this); // 定义一个AlertDialog.Builder对象
builder.setTitle(&登录服务器对话框&); // 设置对话框的标题
// 装载/res/layout/login.xml界面布局
TableLayout loginForm = (TableLayout) getLayoutInflater().inflate(
R.layout.login, null);
final EditText iptext = (EditText) loginForm
.findViewById(R.id.ipedittext);
builder.setView(loginForm); // 设置对话框显示的View对象
// 为对话框设置一个“登录”按钮
builder.setPositiveButton(&登录&
// 为按钮设置监听器
, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 此处可执行登录处理
ipname = iptext.getText().toString().trim();
Bundle data = new Bundle();
data.putString(&ipname&, ipname);
Intent intent = new Intent(GetIP.this, MainActivity.class);
intent.putExtras(data);
startActivity(intent);
// 为对话框设置一个“取消”按钮
builder.setNegativeButton(&取消&, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 取消登录,不做任何事情。
System.exit(1);
// 创建、并显示对话框
builder.create().show();
获取ip后就跳转到MainActivity。
package com.wenix.
import java.io.ByteArrayInputS
import java.io.ByteArrayOutputS
import java.io.IOE
import java.io.OutputS
import java.net.S
import android.app.A
import android.content.I
import android.graphics.ImageF
import android.graphics.R
import android.graphics.YuvI
import android.hardware.C
import android.hardware.Camera.S
import android.os.B
import android.util.L
import android.view.SurfaceH
import android.view.SurfaceHolder.C
import android.view.SurfaceV
import android.view.W
import android.view.WindowM
public class MainActivity extends Activity {
SurfaceView sV
SurfaceHolder surfaceH
int screenWidth, screenH
C // 定义系统所用的照相机
boolean isPreview = // 是否在浏览中
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// 获取IP地址
Intent intent = getIntent();
Bundle data = intent.getExtras();
ipname = data.getString(&ipname&);
screenWidth = 640;
screenHeight = 480;
sView = (SurfaceView) findViewById(R.id.sView); // 获取界面中SurfaceView组件
surfaceHolder = sView.getHolder(); // 获得SurfaceView的SurfaceHolder
// 为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
public void surfaceCreated(SurfaceHolder holder) {
initCamera(); // 打开摄像头
public void surfaceDestroyed(SurfaceHolder holder) {
// 如果camera不为null ,释放摄像头
if (camera != null) {
if (isPreview)
camera.stopPreview();
camera.release();
System.exit(0);
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
private void initCamera() {
if (!isPreview) {
camera = Camera.open();
if (camera != null && !isPreview) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小
parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小
// camera.setParameters(parameters); // android2.3.3以后不需要此行代码
camera.setPreviewDisplay(surfaceHolder); // 通过SurfaceView显示取景画面
camera.setPreviewCallback(new StreamIt(ipname)); // 设置回调的类
camera.startPreview(); // 开始预览
camera.autoFocus(null); // 自动对焦
} catch (Exception e) {
e.printStackTrace();
isPreview =
class StreamIt implements Camera.PreviewCallback {
public StreamIt(String ipname) {
this.ipname =
public void onPreviewFrame(byte[] data, Camera camera) {
Size size = camera.getParameters().getPreviewSize();
// 调用pressToJpeg()将YUV格式图像数据data转为jpg格式
YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
if (image != null) {
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
pressToJpeg(new Rect(0, 0, size.width, size.height), 80, outstream);
outstream.flush();
// 启用线程将图像数据发送出去
Thread th = new MyThread(outstream, ipname);
th.start();
} catch (Exception ex) {
Log.e(&Sys&, &Error:& + ex.getMessage());
class MyThread extends Thread {
private byte byteBuffer[] = new byte[1024];
private OutputS
private ByteArrayOutputS
public MyThread(ByteArrayOutputStream myoutputstream, String ipname) {
this.myoutputstream =
this.ipname =
myoutputstream.close();
} catch (IOException e) {
e.printStackTrace();
public void run() {
// 将图像数据通过Socket发送出去
Socket tempSocket = new Socket(ipname, 6000);
outsocket = tempSocket.getOutputStream();
ByteArrayInputStream inputstream = new ByteArrayInputStream(myoutputstream.toByteArray());
while ((amount = inputstream.read(byteBuffer)) != -1) {
outsocket.write(byteBuffer, 0, amount);
myoutputstream.flush();
myoutputstream.close();
tempSocket.close();
} catch (IOException e) {
e.printStackTrace();
}这样就打开了socket,然后把camera获取的数据发送到PC端。
PC端代码:
package com.
import java.awt.D
import java.awt.G
import java.awt.I
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.io.F
import java.io.FileNotFoundE
import java.io.IOE
import java.io.InputS
import java.io.RandomAccessF
import java.net.ServerS
import java.net.S
import javax.imageio.ImageIO;
import javax.swing.JB
import javax.swing.JFileC
import javax.swing.JF
import javax.swing.JP
public class ImageServer {
public static ServerSocket ss =
public static void main(String args[]) throws IOException{
ss = new ServerSocket(6000);
final ImageFrame frame = new ImageFrame(ss);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while(true){
frame.panel.getimage();
frame.repaint();
A frame with an image panel
@SuppressWarnings(&serial&)
class ImageFrame extends JFrame{
public ImageP
public ImageFrame(ServerSocket ss){
// get screen dimensions
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.
int screenWidth = screenSize.
// center frame in screen
setTitle(&ImageTest&);
setLocation((screenWidth - DEFAULT_WIDTH) / 2, (screenHeight - DEFAULT_HEIGHT) / 2);
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// add panel to frame
this.getContentPane().setLayout(null);
panel = new ImagePanel(ss);
panel.setSize(640,480);
panel.setLocation(0, 0);
add(panel);
jb = new JButton(&拍照&);
jb.setBounds(0,480,640,50);
saveimage saveaction = new saveimage(ss);
jb.addActionListener(saveaction);
public static final int DEFAULT_WIDTH = 640;
public static final int DEFAULT_HEIGHT = 560;
A panel that displays a tiled image
@SuppressWarnings(&serial&)
class ImagePanel extends JPanel {
private ServerS
private InputS
public ImagePanel(ServerSocket ss) {
public void getimage() throws IOException{
Socket s = this.ss.accept();
System.out.println(&连接成功!&);
this.ins = s.getInputStream();
this.image = ImageIO.read(ins);
this.ins.close();
public void paintComponent(Graphics g){
super.paintComponent(g);
if (image == null)
g.drawImage(image, 0, 0, null);
class saveimage implements ActionListener {
RandomAccessFile inFile =
byte byteBuffer[] = new byte[1024];
private ServerS
public saveimage(ServerSocket ss){
public void actionPerformed(ActionEvent event){
Socket s = ss.accept();
ins = s.getInputStream();
// 文件选择器以当前的目录打开
JFileChooser jfc = new JFileChooser(&.&);
jfc.showSaveDialog(new javax.swing.JFrame());
// 获取当前的选择文件引用
File savedFile = jfc.getSelectedFile();
// 已经选择了文件
if (savedFile != null) {
// 读取文件的数据,可以每次以快的方式读取数据
inFile = new RandomAccessFile(savedFile, &rw&);
} catch (FileNotFoundException e) {
e.printStackTrace();
while ((amount = ins.read(byteBuffer)) != -1) {
inFile.write(byteBuffer, 0, amount);
inFile.close();
ins.close();
s.close();
javax.swing.JOptionPane.showMessageDialog(new javax.swing.JFrame(),
&已接保存成功&, &提示!&, javax.swing.JOptionPane.PLAIN_MESSAGE);
} catch (IOException e) {
e.printStackTrace();
运行结果如下:
手机视频:
pc端视频:
可以看到视频数据已经上传到了PC端。
接下来要完善的地方:
1。Android端可以提供一个Url,然后PC端使用浏览器来浏览。
2。PC端添加视频录制功能。
3。添加图像检测功能,比如运动物体检测等,这样就可以扩展为监控摄像头了。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48645次
排名:千里之外
原创:12篇
评论:26条
(1)(2)(1)(5)(3)如何在两部手机上实现移动视频监控
1. 需要设备:两部手机,一个软件。智能手机的操作系统Android 2.0 以上,就能安装高清版的千里眼VSir。
2. 下载安装千里眼VSir 到手机,安装注册, 就能得到一个千里眼号, 以后就用这个千里眼号就能登入使用千里眼的功能。注意两部手机都要下载安装该软件。
被当做监控摄像头的手机设置为允许被监控,设置好被监控号,把其摄像头对准要监控的地方。
4. 另一部手机输入被监控号, 就能查看到被监控手机摄像头拍摄到的实时画面。还可以截图, 录像。
5. 手机的移动化特点, 使得视频监控也能实现移动化。 千里眼流量小, 花费小。免费试用, 之后只收取流量费, 不监控的时候关上手机, 没有流量!
6. 有手机信号的地方, 就能视频监控。千里眼VSir 还能自动调节流量, 手机信号不好的地方也能保证清晰稳定的视频。
7. 除了视频监控, 安装一个千里眼VSir, 你还能享受到下列其他功能: 视频电话, 视频会议, 文件传输, 对讲机, 多人监控等等。
8. 你可以监控房间防盗, 可以远程看护保姆照顾宝宝情况, 远程看护宠物,管理多个连锁店, 监控工厂流水线。。。。
推荐到广播
80584 人聚集在这个小组
(隔壁房东家的猫)
(我叫申不在)
(米米米米米米兔)
第三方登录:}

我要回帖

更多关于 监控画面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信