在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android实时视频录制并上传至服务器源码,可做远程监控,含android客户机以及服务器端代码(已测试通过)

android实时视频录制并上传至服务器源码,可做远程监控,含android客户机以及服务器端代码(已测试通过)

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.04M
  • 下载次数:191
  • 浏览次数:11846
  • 发布时间:2013-02-07
  • 实例类别:Android平台开发
  • 发 布 人:星火燎原
  • 文件格式:.rar
  • 所需积分:5
 相关标签: Android 上传 视频

实例介绍

【实例简介】

开发环境为Windows XP java 1.6 Eclipse3.4.2
Android版本为1.5
手机测试平台为HTC Hero

AndroidVideo为手机端的源代码
AndroidVideoPC为PC端的源代码


【实例截图】服务器端实时监控截图


【核心代码】
andriod客户端代码:

 

package com.sunshine;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class AndroidVideo extends Activity implements Callback,OnClickListener{
	private SurfaceView mSurfaceView = null;
	private SurfaceHolder mSurfaceHolder = null;
	private Camera mCamera = null;
	private boolean mPreviewRunning = false;
	
	//连接相关
	private EditText remoteIP=null;
	private Button connect=null;
	private String remoteIPStr=null;

	//视频数据
	private StreamIt streamIt=null;
	public static  Kit kit=null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		getWindow().setFormat(PixelFormat.TRANSLUCENT);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		setContentView(R.layout.main);

		mSurfaceView = (SurfaceView) this.findViewById(R.id.surface_camera);
		mSurfaceHolder = mSurfaceView.getHolder();
		mSurfaceHolder.addCallback(this);
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		
		remoteIP=(EditText)this.findViewById(R.id.remoteIP);
		connect=(Button)this.findViewById(R.id.connect);
		connect.setOnClickListener(this);

	}


	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		if (mPreviewRunning) {
			mCamera.stopPreview();
		}
		Camera.Parameters p = mCamera.getParameters();
		p.setPreviewSize(width, height);
		streamIt=new StreamIt();
		kit=new Kit();
		mCamera.setPreviewCallback(streamIt);

		mCamera.setParameters(p);
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (Exception ex) {
		}
		mCamera.startPreview();
		mPreviewRunning = true;
	}


	public void surfaceCreated(SurfaceHolder holder) {
		mCamera = Camera.open();
	}


	public void surfaceDestroyed(SurfaceHolder holder) {
		mCamera.stopPreview();
		mPreviewRunning = false;
		mCamera.release();
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		try {
			super.onConfigurationChanged(newConfig);
			if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
			} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
			}
		} catch (Exception ex) {
		}
	}

	class Kit implements Runnable {
		private boolean run=true;
//		private final int dataLen=57600; //307200 OR 230400 76800 OR 57600
		private final int tt=28800;

		public void run() {
			// TODO Auto-generated method stub
			try {
				Socket socket = new Socket(remoteIPStr, 8899);
				DataOutputStream dos = new DataOutputStream(socket
						.getOutputStream());
				DataInputStream dis = new DataInputStream(socket
						.getInputStream());
				while (run) {
					dos.write(streamIt.yuv420sp, 0, 28800);
					dos.write(streamIt.yuv420sp, 28800, 28800);
					
					dis.readBoolean();
					Thread.sleep(155);
				}
			} catch (Exception ex) {
				run=false;
				ex.printStackTrace();
			}
		}

	}

	@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		if(view==connect){//连接函数
			remoteIPStr=remoteIP.getText().toString();
			new Thread(AndroidVideo.kit).start();
		}
	}
}

class StreamIt implements Camera.PreviewCallback {
	public byte[] yuv420sp =null;
	private boolean t=true;

	public void onPreviewFrame(byte[] data, Camera camera) {
		// TODO Auto-generated method stub
//		if(t){
//			t=false;
//			new Thread(AndroidVideo.kit).start();
//		}
		yuv420sp=data;
	}
}

服务器端代码:

 

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.PixelInterleavedSampleModel;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class FlushMe extends Frame {
	private static final long serialVersionUID = 1L;
	private BufferedImage im;
	// 图像信息
//	private final int width = 480;
//	private final int height = 320;
	private static final int width = 240;
	private static final int height = 160;
	private static final int numBands = 3;
	private static final int dataLen = 57600;//307200 OR 230400//57600 76800
	private static final int tt = 28800;//14400;//28800;
	// 图像数组
	private byte[] byteArray = new byte[width * height * numBands];// 图像RGB数组
	private byte[] yuv420sp = new byte[dataLen];// 图像YUV数组
	
	private static final int[] bandOffsets = new int[] { 0, 1, 2 };
	private static final SampleModel sampleModel = new PixelInterleavedSampleModel(
			DataBuffer.TYPE_BYTE, width, height, 3, width * 3,
			bandOffsets);
	// ColorModel
	private static final ColorSpace cs=ColorSpace.getInstance(ColorSpace.CS_sRGB);
	private static final ComponentColorModel cm=new ComponentColorModel(cs, false, false,
			Transparency.OPAQUE, DataBuffer.TYPE_BYTE);

	public FlushMe() {
		super("Flushing");
		updateIM();
		setSize(480, 320);
		// 窗口关闭方法
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				System.exit(0);
			}
		});
		// 窗口居中
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		this.setVisible(true);
		this.getData();
	}
	
	public void update(Graphics g){
		paint(g);
	}

	public void paint(Graphics g) {
		g.drawImage(im, 0, 0, 480, 320, this);
	}

	public void getData() {
		try {
			ServerSocket server = new ServerSocket(8899);
			Socket socket = server.accept();
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
			while (true) {
				for (int i = 0; i < dataLen / tt; i  ) {
					dis.read(yuv420sp, i * tt, tt);
				}
				// 得到数据之后立即更新显示
				updateIM();
				im.flush();
				repaint();
				
				dos.writeBoolean(true);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	private void updateIM() {
		try {
			// 解析YUV成RGB格式
			decodeYUV420SP(byteArray, yuv420sp, width, height);
			DataBuffer dataBuffer = new DataBufferByte(byteArray, numBands);
			WritableRaster wr = Raster.createWritableRaster(sampleModel,
					dataBuffer, new Point(0, 0));
			im = new BufferedImage(cm, wr, false, null);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	private static void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp,
			int width, int height) {
		final int frameSize = width * height;
		if (rgbBuf == null)
			throw new NullPointerException("buffer 'rgbBuf' is null");
		if (rgbBuf.length < frameSize * 3)
			throw new IllegalArgumentException("buffer 'rgbBuf' size "
					  rgbBuf.length   " < minimum "   frameSize * 3);

		if (yuv420sp == null)
			throw new NullPointerException("buffer 'yuv420sp' is null");

		if (yuv420sp.length < frameSize * 3 / 2)
			throw new IllegalArgumentException("buffer 'yuv420sp' size "
					  yuv420sp.length   " < minimum "   frameSize * 3 / 2);

		int i = 0, y = 0;
		int uvp = 0, u = 0, v = 0;
		int y1192 = 0, r = 0, g = 0, b = 0;

		for (int j = 0, yp = 0; j < height; j  ) {
			uvp = frameSize   (j >> 1) * width;
			u = 0;
			v = 0;
			for (i = 0; i < width; i  , yp  ) {
				y = (0xff & ((int) yuv420sp[yp])) - 16;
				if (y < 0)
					y = 0;
				if ((i & 1) == 0) {
					v = (0xff & yuv420sp[uvp  ]) - 128;
					u = (0xff & yuv420sp[uvp  ]) - 128;
				}

				y1192 = 1192 * y;
				r = (y1192   1634 * v);
				g = (y1192 - 833 * v - 400 * u);
				b = (y1192   2066 * u);

				if (r < 0)
					r = 0;
				else if (r > 262143)
					r = 262143;
				if (g < 0)
					g = 0;
				else if (g > 262143)
					g = 262143;
				if (b < 0)
					b = 0;
				else if (b > 262143)
					b = 262143;

				rgbBuf[yp * 3] = (byte) (r >> 10);
				rgbBuf[yp * 3   1] = (byte) (g >> 10);
				rgbBuf[yp * 3   2] = (byte) (b >> 10);
			}
		}
	}

	public static void main(String[] args) {
		Frame f = new FlushMe();
	}
}

 

标签: Android 上传 视频

实例下载地址

android实时视频录制并上传至服务器源码,可做远程监控,含android客户机以及服务器端代码(已测试通过)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 dayonxin 发表于: 2013-08-25 04:32 45
我来说两句...

支持(0) 盖楼(回复)

第 2 楼 zhangyang 发表于: 2014-09-11 16:20 42
没有用

支持(0) 盖楼(回复)

第 3 楼 付添1234 发表于: 2014-12-03 13:16 18
我真心想下载看看。。。

支持(0) 盖楼(回复)

第 4 楼 黑人约瑟 发表于: 2015-11-04 15:39 29
我来说两句...很重要呀!

支持(0) 盖楼(回复)

第 5 楼 黑人约瑟 发表于: 2015-11-04 15:39 31
我来说两句...很重要呀!

支持(0) 盖楼(回复)

第 6 楼 QTDS 发表于: 2016-03-07 16:56 54
我真心想下载看看。。。

支持(0) 盖楼(回复)

第 7 楼 hardy_sim 发表于: 2016-05-19 15:32 10
我来说两句...我真心想下载看看。。。

支持(0) 盖楼(回复)

第 8 楼 hardy_sim 发表于: 2016-05-19 15:32 13
我来说两句...我真心想下载看看。。。

支持(0) 盖楼(回复)

第 9 楼 sixwalnut 发表于: 2016-09-16 15:41 02
一定要积分吗

支持(0) 盖楼(回复)

第 10 楼 REUS 发表于: 2017-05-19 19:36 16
PC上如何观看

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有10条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警