基于Android的远程视频监控系统.docx
- 文档编号:18220118
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:15
- 大小:102.13KB
基于Android的远程视频监控系统.docx
《基于Android的远程视频监控系统.docx》由会员分享,可在线阅读,更多相关《基于Android的远程视频监控系统.docx(15页珍藏版)》请在冰点文库上搜索。
基于Android的远程视频监控系统
基于android的远程视频监控系统(已开放源码)
基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控。
图片如下(后来PC端加了个拍照功能)。
。
。
(PS。
刚学android和java不久很多东西还不懂,高手若是知道哪些地方可以继续优化的话还请多多指点下啊)
系统代码如下:
一、android手机客户端
(1)AndroidManifest.xml文件。
添加camera和socket权限,并设置了程序开始执行的activity、
xmlversion="1.0" encoding="utf-8"?
>
android=" package="org.wanghai.CameraTest" android: versionCode="1" android: versionName="1.0" > minSdkVersion="15" /> --授予程序使用摄像头的权限--> name="android.permission.CAMERA" /> name="android.hardware.camera" /> name="android.hardware.camera.autofocus" /> name="android.permission.INTERNET"/> name="android.permission.KILL_BACKGROUND_PROCESSES"/> name="android.permission.RESTART_PACKAGES"/> android: icon="@drawable/ic_launcher" android: label="@string/app_name" > android: name=".GetIP" android: screenOrientation="landscape" android: label="@string/app_name" > name="android.intent.action.MAIN" /> name="android.intent.category.LAUNCHER" /> android: name=".CameraTest" android: screenOrientation="landscape" android: label="@string/app_name" > (2)main.xml设置surfaceview用于摄像头采集图像的预览 xmlversion="1.0" encoding="utf-8"? > android=" android: layout_width="fill_parent" android: layout_height="fill_parent" android: orientation="vertical" > android: id="@+id/sView" android: layout_width="fill_parent" android: layout_height="fill_parent" android: scaleType="fitCenter"/> (3)login.xml登录界面,用于输入服务器IP xmlversion="1.0" encoding="utf-8"? > android=" android: id="@+id/loginForm" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > android: layout_width="fill_parent" android: layout_height="wrap_content" android: text="IP: " android: textSize="10pt" /> --输入用户名的文本框--> android: id="@+id/ipedittext" android: layout_width="fill_parent" android: layout_height="wrap_content" android: digits="0123456789." android: hint="请填写服务器IP" android: selectAllOnFocus="true" /> (4)GetIP.java获得服务器IP后,通过Intent启动CameraTest的activity,ip信息通过Bundle传递 public class GetIPextends Activity{ Stringipname=null; @Override public void onCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); final Builderbuilder=new AlertDialog.Builder(this); //定义一个AlertDialog.Builder对象 builder.setTitle("登录服务器对话框"); //设置对话框的标题 //装载/res/layout/login.xml界面布局 TableLayoutloginForm=(TableLayout)getLayoutInflater().inflate(R.layout.login,null); final EditTextiptext=(EditText)loginForm.findViewById(R.id.ipedittext); builder.setView(loginForm); //设置对话框显示的View对象 //为对话框设置一个“登录”按钮 builder.setPositiveButton("登录" //为按钮设置监听器 new OnClickListener(){ @Override public void onClick(DialogInterfacedialog,int which){ //此处可执行登录处理 ipname=iptext.getText().toString().trim(); Bundledata=new Bundle(); data.putString("ipname",ipname); Intentintent=new Intent(GetIP.this,CameraTest.class); intent.putExtras(data); startActivity(intent); } }); //为对话框设置一个“取消”按钮 builder.setNegativeButton("取消" new OnClickListener() { @Override public void onClick(DialogInterfacedialog,int which) { //取消登录,不做任何事情。 System.exit (1); } }); //创建、并显示对话框 builder.create().show(); } } (5)CameraTest.java程序主体。 设置PreviewCallback后,每当一帧图像数据采集完成后将调用PreviewCallback的onPreviewFrame函数。 在这里我们将YUV格式数据转为jpg,再启用线程将数据通过socket发送出去。 public class CameraTestextends Activity{ SurfaceViewsView; SurfaceHoldersurfaceHolder; int screenWidth,screenHeight; Cameracamera; //定义系统所用的照相机 boolean isPreview=false; //是否在浏览中 private Stringipname; @SuppressWarnings("deprecation") @Override public void onCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); //获取IP地址 Intentintent=getIntent(); Bundledata=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(SurfaceHolderholder,int format,int width,int height) { } @Override public void surfaceCreated(SurfaceHolderholder){ initCamera(); //打开摄像头 } @Override public void surfaceDestroyed(SurfaceHolderholder){ //如果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.Parametersparameters=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 (Exceptione){ e.printStackTrace(); } isPreview=true; } } } class StreamItimplements Camera.PreviewCallback{ private Stringipname; public StreamIt(Stringipname){ this.ipname=ipname; } @Override public void onPreviewFrame(byte[]data,Cameracamera){ Sizesize=camera.getParameters().getPreviewSize(); try{ //调用pressToJpeg()将YUV格式图像数据data转为jpg格式 YuvImageimage=new YuvImage(data,ImageFormat.NV21,size.width,size.height,null); if(image! =null) { ByteArrayOutputStreamoutstream=new ByteArrayOutputStream(); pressToJpeg(new Rect(0,0,size.width,size.height),80,outstream); outstream.flush(); //启用线程将图像数据发送出去 Threadth=new MyThread(outstream,ipname); th.start(); } }catch(Exceptionex){ Log.e("Sys","Error: "+ex.getMessage()); } } } class MyThreadextends Thread{ private byte byteBuffer[]=new byte[1024]; private OutputStreamoutsocket; private ByteArrayOutputStreammyoutputstream; private Stringipname; public MyThread(ByteArrayOutputStreammyoutputstream,Stringipname) { this.myoutputstream=myoutputstream; this.ipname=ipname; try { myoutputstream.close(); }catch (IOExceptione){ e.printStackTrace(); } } public void run(){ try{ //将图像数据通过Socket发送出去 SockettempSocket=new Socket(ipname,6000); outsocket=tempSocket.getOutputStream(); ByteArrayInputStreaminputstream=new ByteArrayInputStream(myoutputstream.toByteArray()); int amount; while ((amount=inputstream.read(byteBuffer))! =-1){ outsocket.write(byteBuffer,0,amount); } myoutputstream.flush(); myoutputstream.close(); tempSocket.close(); }catch (IOExceptione){ e.printStackTrace(); } } } 二、PC服务器端 ImageServer.java用于显示图像,并且可以拍照 public class ImageServer{ public static ServerSocketss=null; public static void main(Stringargs[])throws IOException{ ss=new ServerSocket(6000); final ImageFrameframe=new ImageFrame(ss); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); while(true){ frame.panel.getimage(); frame.repaint(); } } } /** Aframewithanimagepanel */ @SuppressWarnings("serial") class ImageFrameextends JFrame{ public ImagePanelpanel; public JButtonjb; public ImageFrame(ServerSocketss){ //getscreendimensions Toolkitkit=Toolkit.getDefaultToolkit(); DimensionscreenSize=kit.getScreenSize(); int screenHeight=screenSize.height; int screenWidth=screenSize.width; //centerframeinscreen setTitle("ImageTest"); setLocation((screenWidth-DEFAULT_WIDTH)/2,(screenHeight-DEFAULT_HEIGHT)/2); setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); //addpaneltoframe 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); saveimagesaveaction=new saveimage(ss); jb.addActionListener(saveaction); } public static final int DEFAULT_WIDTH=640; public static final int DEFAULT_HEIGHT=560; } /** Apanelthatdisplaysatiledimage */ @SuppressWarnings("serial") class ImagePanelextends JPanel{ private ServerSocketss; private Imageimage; private InputStreamins; public ImagePanel(ServerSocketss){ this.ss=ss; } public void getimage()throws IOException{ Sockets=this.ss.accept(); System.out.println("连接成功! "); this.ins=s.getInputStream(); this.image=ImageIO.read(ins); this.ins.close(); } public void paintComponent(Graphicsg){ super.paintComponent(g); if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Android 远程 视频 监控 系统