查看PC实时摄像头视频,其实就是以大于24次/秒的速度,控制PC摄像头进行拍照,并把每一张拍得的图片发送到android手机端,在手机上展示这些图片,得到实时的视频。
主要解决两个问题一时调用PC摄像头拍摄图片,二是在PC和android之间传输图片。
利用JavaCV(简介见本文末尾)调用PC摄像头很简单
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
//调用grab()方法就能得到IplImage类的一个对象,进行进一步处理就能得到图片
传输图片涉及图片数据和字节流之间的转化
PC端将图片转化为字节流
while ((image = grabber.grab()) != null && writeImageSocket.isConnected()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image.getBufferedImage(), "jpg", baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();
dos.writeInt(imageInByte.length);
dos.write(imageInByte,0,imageInByte.length);
dos.flush();
}
Android读取字节流转化为图片
while (true) {
int size = dataInput.readInt();
Log.e("size in client", Integer.toString(size));
byte[] data = new byte[size];
int len = 0;
while (len < size) {
len += dataInput.read(data, len, size - len);
}
ByteArrayOutputStream outPut = new ByteArrayOutputStream();
bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
bitmap.compress(CompressFormat.PNG, 100, outPut);
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
具体代码
PC端服务程序的实现CameraSever.java
package com.giantpoplar.cameraserver;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.imageio.ImageIO;