启动tcp的接收端口,如下代码:
videoReceiveListener=TCPVideoReceiveListener.getInstance();
videoReceiveListener.setBitmapLoaded(VideoChatActivity.this);
if(!videoReceiveListener.isRunning())
videoReceiveListener.open();// 先监听端口,然后连接
server=new ServerSocket(port);
接收端启动后就可以往接收端发送东西,
连接接收端:
Socket socket=new Socket(InetAddress.getByName(chatIp), Constants.VIDEO_PORT);
发送图片数据过去之前首先要设置参数:
// TODO Auto-generated method stub
Camera.Parameters parameters=camera.getParameters();//得到相机设置参数
Size size = camera.getParameters().getPreviewSize(); //获取预览大小
w=size.width;
h=size.height;
parameters.setPictureFormat(PixelFormat.JPEG);//设置图片格式
PreviewFormat=parameters.getPreviewFormat();
setDisplayOrientation(camera, 90);
camera.setPreviewCallback(this);
camera.setParameters(parameters);
camera.startPreview();//开始预览
try {
Method downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[] { angle });
} catch (Exception e1) {
e1.printStackTrace();
}
int cameras=Camera.getNumberOfCameras();
CameraInfo info=new CameraInfo();
for(int i=0;i<cameras;i++){
Camera.getCameraInfo(i, info);
if(info.facing==CameraInfo.CAMERA_FACING_FRONT){
camera=Camera.open(i);
break;
}
}
//没有前置摄像头
if(camera==null) camera=Camera.open();
try {
camera.setPreviewDisplay(surfaceHolder);
camera.setPreviewCallback(this);
} catch (Exception e) {
camera.release();//释放资源
camera=null;
}
把图片数据发送过去,
OutputStream out=socket.getOutputStream();
YuvImage image = new YuvImage(arg0, PreviewFormat, w, h, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Rect rect=new Rect(0, 0, w, h);
//1:将YUV数据格式转化成jpeg
if(!image.compressToJpeg(rect, 100, os)) return ;
//2:将得到的字节数组压缩成bitmap
Bitmap bmp = Util.decodeVideoBitmap(os.toByteArray(), 200);
Matrix matrix=new Matrix();
matrix.setRotate(-90);
//3:旋转90
bmp=Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
//4:将最后的bitmap转化为字节流发送
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
out.write(baos.toByteArray());
out.flush();
out.close();
socket.close();
回调方法:接收到数据以后把数据设置上去
// 当视频来的时候我接收这个bitmap
@Override
public void onBitmapLoaded(Bitmap bitmap) {
handler.sendMessage(handler.obtainMessage(REFRESH, bitmap));
if(stop){
try {
//代码实现模拟用户按下back键
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_BACK;
Runtime runtime = Runtime.getRuntime();
runtime.exec(keyCommand);
stop=false;
} catch (IOException e) {
e.printStackTrace();
}
}
}
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
myView.setBitmap((Bitmap)msg.obj);
};
};