精华内容
下载资源
问答
  • 把Android手机变成远程监控摄像头

    千次阅读 2019-04-29 15:19:37
    把Android手机变成远程监控摄像头
                   

    基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控。图片如下(后来PC端加了个拍照功能)。。。

    基于Android的远程视频监控系统(含源码)

     

    (PS。刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊)

    系统代码如下:
    一、android手机客户端
    (1)AndroidManifest.xml文件。添加camera和socket权限,并设置了程序开始执行的activity、

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?xmlversion="1.0"encoding="utf-8"?>
    <manifestxmlns:android="http://schemas.android.com/apk/res/android"
        package="org.wanghai.CameraTest"
        android:versionCode="1"
        android:versionName="1.0">
      
        <uses-sdkandroid:minSdkVersion="15"/>
          
        <!-- 授予程序使用摄像头的权限 -->
            <
    展开全文
  • Android下实现一个手机监控摄像头

    万次阅读 热门讨论 2012-09-11 22:56:58
    一直想在自己的Android手机上实现一个手机监控摄像头功能。今天逛论坛,看到一个例子,于是做了出来,留着以后完善。 功能点: 1。AndroidPC通过socket通信。 2。Android下Camera的使用。 看代码: package ...

    一直想在自己的Android手机上实现一个手机监控摄像头功能。今天逛论坛,看到一个例子,于是做了出来,留着以后完善。

    功能点:

    1。Android和PC通过socket通信。

    2。Android下Camera的使用。

    看代码:

    package com.wenix.androidcameramonitor;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.EditText;
    import android.widget.TableLayout;
    
    public class GetIP extends Activity {
        String ipname = null;
    
        @Override
        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() {
    		    @Override
    		    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() {
    	    @Override
    	    public void onClick(DialogInterface dialog, int which) {
    		// 取消登录,不做任何事情。
    		System.exit(1);
    	    }
    	});
    	// 创建、并显示对话框
    	builder.create().show();
        }
    }

    获取ip后就跳转到MainActivity。

    package com.wenix.androidcameramonitor;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.ImageFormat;
    import android.graphics.Rect;
    import android.graphics.YuvImage;
    import android.hardware.Camera;
    import android.hardware.Camera.Size;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.Window;
    import android.view.WindowManager;
    
    public class MainActivity extends Activity {
    	SurfaceView sView;
    	SurfaceHolder surfaceHolder;
    	int screenWidth, screenHeight;
    	Camera camera; // 定义系统所用的照相机
    	boolean isPreview = false; // 是否在浏览中
    	private String ipname;
    
    	@Override
    	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() {
    			@Override
    			public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    			}
    
    			@Override
    			public void surfaceCreated(SurfaceHolder holder) {
    				initCamera(); // 打开摄像头
    			}
    
    			@Override
    			public void surfaceDestroyed(SurfaceHolder holder) {
    				// 如果camera不为null ,释放摄像头
    				if (camera != null) {
    					if (isPreview)
    						camera.stopPreview();
    					camera.release();
    					camera = null;
    				}
    				System.exit(0);
    			}
    		});
    		// 设置该SurfaceView自己不维护缓冲
    		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
    	}
    
    	private void initCamera() {
    		if (!isPreview) {
    			camera = Camera.open();
    		}
    		if (camera != null && !isPreview) {
    			try {
    				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 = true;
    		}
    	}
    
    }
    
    class StreamIt implements Camera.PreviewCallback {
    	private String ipname;
    
    	public StreamIt(String ipname) {
    		this.ipname = ipname;
    	}
    
    	@Override
    	public void onPreviewFrame(byte[] data, Camera camera) {
    		Size size = camera.getParameters().getPreviewSize();
    		try {
    			// 调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
    			YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
    			if (image != null) {
    				ByteArrayOutputStream outstream = new ByteArrayOutputStream();
    				image.compressToJpeg(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 OutputStream outsocket;
    	private ByteArrayOutputStream myoutputstream;
    	private String ipname;
    
    	public MyThread(ByteArrayOutputStream myoutputstream, String ipname) {
    		this.myoutputstream = myoutputstream;
    		this.ipname = ipname;
    		try {
    			myoutputstream.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void run() {
    		try {
    			// 将图像数据通过Socket发送出去
    			Socket tempSocket = new Socket(ipname, 6000);
    			outsocket = tempSocket.getOutputStream();
    			ByteArrayInputStream inputstream = new ByteArrayInputStream(myoutputstream.toByteArray());
    			int amount;
    			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.wenix;
    
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.RandomAccessFile;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class ImageServer {        
        public static ServerSocket ss = null;
        
        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 ImagePanel panel;
            public JButton jb;
       
        public ImageFrame(ServerSocket ss){
                   // get screen dimensions              
                   Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            int screenHeight = screenSize.height;
            int screenWidth = screenSize.width;
    
            // 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);
            add(jb);
            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 ServerSocket ss;
        private Image image;
        private InputStream ins;
             
        public ImagePanel(ServerSocket ss) {  
                this.ss = 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) return;
            g.drawImage(image, 0, 0, null);
        }
    
    }
    
    class saveimage implements ActionListener {
            RandomAccessFile inFile = null;
            byte byteBuffer[] = new byte[1024];
            InputStream ins;
            private ServerSocket ss;
            
            public saveimage(ServerSocket ss){
                    this.ss = ss;
            }
            
            public void actionPerformed(ActionEvent event){
            try {
                            Socket s = ss.accept();
                            ins = s.getInputStream();
                            
                            // 文件选择器以当前的目录打开
                    JFileChooser jfc = new JFileChooser(".");
                    jfc.showSaveDialog(new javax.swing.JFrame());
                    // 获取当前的选择文件引用
                    File savedFile = jfc.getSelectedFile();
                    
                    // 已经选择了文件
                    if (savedFile != null) {
                        // 读取文件的数据,可以每次以快的方式读取数据
                        try {
                                            inFile = new RandomAccessFile(savedFile, "rw");
                                    } catch (FileNotFoundException e) {
                                            e.printStackTrace();
                                    }
                    }
    
                int amount;
                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。添加图像检测功能,比如运动物体检测等,这样就可以扩展为监控摄像头了。


    展开全文
  • 起序:新手触碰 Android开发 领域,有望大佬指点。 源码 - Gitee 源码 - Github 加注:不管是进入 Gitee or...新手机的快速迭代更新使得一部分人对最新版手机有更高的使用期望,这就造成了这部分人原来使用的手机会..
    • 起序:新手触碰 Android开发 领域,有望大佬指点。

      源码 - Gitee
      源码 - Github

    • 加注:不管是进入 Gitee or Github 中,给孩子点个 star 呗。

    一、为什么想做这个项目?

    这也许是一个比较令人深省的问题,可能是突发奇想,一时兴起,也可能是锻炼自己在 Android开发 领域的能力。虽然这不是一个特别新颖的想法,但在 资源回收利用 方面还是有那么一点能力体现的。新手机的快速迭代更新使得一部分人对最新版手机有更高的使用期望,这就造成了这部分人原来使用的手机会被 搁浅 ,而这些手机 最终的去处也各式各样 ,可能被 尘封、低价卖出、当板砖。以上纯属个人 YY,下面进入正题。

    二、简介

    项目主要二次利用 Android 系统比较旧版本的手机,把旧手机的摄像头当作 监控摄像头,利用视频聊天的方式,在旧手机上安装一个 APP (AndMon) 录取视频,在其他手机上安装一个 APP (Monitor) 接收旧手机的视频流,这个功能是在 Monitor 通过 扫一扫二维码 的形式进而实现监控的目的。在 AndMon 上同时存在着 录制视频 的功能,录制的视频可以上传到 阿里云服务器上 ,然而可以在 Monitor 上的 媒体库 选项中查看录制好的视频。

    三、框架

    项目难免会用到第三方框架实现一些 自己觉得看似牛逼 但常用的功能,虽然不是自己编写的,但读懂第三方框架简单实现的代码也是一种能力,对不对。

    • SMSSDK : 实现了手机号获取验证码
    • zxing : 实现了二维码的扫描
    • agora : 实现了新手机查看旧手机的视频监控

    注:这三个框架功能强大,我只是利用了部分功能,还有其他功能需要发掘使用,在这里不细说。

    四、架构图解

    新手绘制架构图,如有 架构师大佬指点 ,感激涕零。

    在这里插入图片描述

    五、页面展示

    只截取了静态页面,功能界面 需要录制视频,偷个懒,如有兴趣,下方有联系方式。

    在这里插入图片描述

    展开全文
  • 旧安卓手机改为门禁探头,或用作监控摄像头可行性资料分析,仅供创意灵感参考!其一、手机直接对准猫眼就是将手机直接贴在门上,摄像头对准猫眼(可能镜头会模糊,猫眼需改为广角,该方案还未测试),手机打开摄像头...

    旧安卓手机改为门禁探头,或用作监控摄像头可行性资料分析,仅供创意灵感参考!

    其一、手机直接对准猫眼

    e2fd3b18c573787c78fb7a424e5afae3.png
    5ba0699a20675eefb37a62a96e088dcb.png

    就是将手机直接贴在门上,摄像头对准猫眼(可能镜头会模糊,猫眼需改为广角,该方案还未测试),手机打开摄像头应用,关屏即可,如有来人敲门可解锁手机直接进入摄像头画面;或者将手机电源按键引线接到门铃按键上,有人按门铃手机就自动点亮。

    手机供电:可就近取楼道对讲机上电源,如电压不符,用调压模块改变。

    同时,该手机里面安装一个《IP摄像头》的APP,可实现无线摄像头功能,其它在用的手机也安装上就可以实现无线摄像头的功能了,在里屋也能看是谁来了,并且还可以录像。

    其二、用USB摄像头

    2e0982c8cc8161440aabad35e405c6aa.png

    前提:手机支持OTG功能、OTG线、USB摄像头、下载安装《USB摄像头》APP

    将USB摄像头对准或想法塞入猫眼,延长线视具体情况可选长度不等,手机放与楼道对讲机旁边。

    同样,手机打开《USB摄像头》应用,关屏即可,如有来人敲门可解锁手机直接进入摄像头画面;或者将手机电源按键引线接到门铃按键上,有人按门铃手机就自动点亮。

    再简单一点,直接购买一个智能摄像头,目前小米官网有一款99元的华来小方智能摄像机 1S,或者129元的小米米家智能摄像机,再或者直接购买智能门铃。

    本文的宗旨是想旧物创意利用起来,所以尽量考虑用旧手机改造。

    展开全文
  • 现如今智能手机更新换代太频繁,换下来的旧手机卖二手不值钱,丢弃又觉得可惜,...在这里要推荐一个变废为宝的好办法,就是通过安装一个免费的“警猫眼”的App,把闲置旧手机变成专业网络摄像头,即经济又环保!!!
  • PC端监控android手机摄像头并显示,系统4.03的,其他版本自己改
  • NULL 博文链接:https://skymr.iteye.com/blog/2023711
  • 如果你认为家庭监控摄像机马路上专门拍车牌的摄像机一样,那你就错了。尽管这两种产品都被叫做监控摄像机,其功能效果上还是有很大区别。如何给家庭监控摄像机一个更清晰、直观的定义?今天笔者就来跟您聊一聊。...
  • 家里新房子的前期准备工作已经接近尾声,再过几天,专业的建筑施工队伍就要入场开工了。接下来这几天,需要把水泥,砖头,钢筋等物料提前准备好。...开淘宝瞄了一眼,各种监控摄像头品类繁多,造型各异,感觉...
  • 海康威视大家都熟悉的安防大品牌,很多人可能用过海康监控摄像头,随着安防产品网络化,各行各业都会有人会问,我能不能把这已经装的海康监控摄像头画面放到互联网上做视频直播呢? 答案当然是可以,只要有需求,...
  • 监控摄像头如何用作网络直播?

    千次阅读 2020-03-05 10:56:22
    今天我看到了这样问题:“监控摄像头如何用作网络直播?”,通常我都会直接在问题下回帖,但是我发现对视频监控直播方面有不了解的人仍在多数,所以干脆将我的想法记录下来,大家以后查阅起来也方便。 随着科技...
  • 本文介绍如何使用云视睿博的监控转发系统将局域网内的监控摄像头视频转发到互联网上,通过云视睿博流媒体服务器NTV Media Server G3进行流媒体播出。用户通过智能手机、PC等终端远程监看,并可以通过API接口实现与...
  • 安装小豚当家监控摄像头

    千次阅读 2020-12-17 21:38:13
    首先手机打开wifi,并且wifi是2.4G的网络,不是5G的网络,这个很重要–>打开蓝牙 扫描说明书上的智慧生活APP的二维码,下载安装APP 打开APP,登录APP 点击底部菜单的最左侧第一个菜单“家居” 点击右上角的“+”...
  • 索性决定还是直接买一个监控摄像头。 开淘宝瞄了一眼,各种监控摄像头品类繁多,造型各异,感觉有些眼花缭乱了。赶紧退出,先确定一下自己的需求预算。 要有防水能力。新房子的工地,安装条件有限。 要有夜视
  • 监控摄像头,车载摄像头选型

    千次阅读 2015-07-07 11:44:32
    视频监控成像方案很多,但从架构上来看,主要包括两种:其一,采用CCD/CMOS传感器(Image Sensor)作为图像采集设备,配套提供实现图像处理编码功能的SoC芯片;其二,采用前端摄影机模块,作为图像采集设备,一个...
  • SRS开源作者让我写一篇文章介绍下视频监控摄像头的互联网化实践思路,很有幸毕业这几年工作的大体方向都跟这个有关系,本篇就抛砖引玉说下视频监控设备上云的一些实践思考。 本篇文章核心内容大致分为下面几个...
  • 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限,但这并不妨碍这些小而美的美食服务于...
  • 今天教大家2个小技巧,用家中闲置的安卓手机或者电脑摄像头,DIY搭建小型视频监控 先在手机上安装一款远程控制软件向日葵,登录同一帐号; 然后在手机主控端【设备】列表下,找到需要被控的另一台手机,然后选择...
  • 摄像头监控万能

    2013-02-25 20:38:12
    摄像头监控万能
  • 市场很多幼儿园、农场、养殖场、交通路况很多地方已经安装过海康威视监控摄像头,但现在主要用来做本地监控的,想接入网站、手机、电脑无控件直播,想接入到微信做直播,下面我给大家介绍一种可以接入简单方法,使用...
  • 当今是一个互联网的时代,视频监控直播可以随时的了解当前的情况也是必不可少的
  • GB28181流媒体服务 ...支持语音对讲的设备,可以直接接入LiveGBS,这样就可以从控制中心您关注的设备间,进行语音对讲 配置语音输出通道编码 看到有 语音输出通道编码 表示支持语音对讲功能 按住说话 ...
  • 监控摄像头网页直播解决方案

    万次阅读 2017-05-27 10:28:05
    今天谈谈网络监控直播(Ipcam Live Broadcasting)。 客户需求场景:   场景1 我们已有网站,做仓储监控的,在全国很多地方都有仓库,数量众多。观看监控方式初步设计为:根据管理员发放的帐号密码登录...
  • 网络摄像头,也就是IP camera, 简称IPcam。是传统摄像头与网络视频技术相结合的新一代产品,除了具备一般... 目前市场上技术先进的流媒体系统,目前默认都是支持接收RTMP流,对于只输出RTSP流的网络监控摄像头,需要

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,323
精华内容 4,929
关键字:

和手机连的监控摄像头