本人菜鸟,想实现局域网内,两个手机端的实时监控。现在图像是出来了,就是太卡了。一顿一顿的,基本无法用。我现在的方案是:手机摄像头端通过回调的方法拿到图片byte[],然后通过socket,tcp发送图片到另一个手机端。另一个手机端通过Imageview实现图片的显示,我是每s传20到30张图片。现在是有现象了,比较卡顿,求高手指点,哪里可以改善,或者有好的方案,可以给小弟指点一下,感激不尽
如果是传输数据卡,可以试试以下方案:
调用设置Socket类的以下方法
setReceiveBufferSize(int size)
setSendBufferSize(int size)
size大一些:1024*1024 *2 (2M)
接收端和发送端设置一样的大小
接收时,输入流用 new BufferedInputStream(socket.getInputStream());
这样提升一下读性能
一个是手机显示视频的ImageView用一些第三方库。性能会好些。
先要分析清楚是传输数据卡,还是显示图片卡?
要先判断瓶颈是在网络还是你本地的显示程序,你可以进行测试判断
我不知道这样做对不对,方案是否可行,要是方案有问题,搞半天也搞不出来...还有就是图片的显示我用的是Bitmap bm = BitmapFactory.decodeByteArray(databuffer, 0, databuffer.length); 然后直接就把图片显示到Imageview了,这个应该是没啥问题的吧,我想主要是socket通信导致慢的
我把我的核心代码贴出来:
首先是摄像头的手机端:
//将图像数据通过Socket发送出去
Socket tempSocket = new Socket(ipname, 6000);
outsocket = tempSocket.getOutputStream();
byte[] bytes = myoutputstream.toByteArray();
Log.d("CameraTest","bytes length : "+bytes.length);
byte[] byteslen = intToBytes(bytes.length);
byte[] bytesend = new byte[bytes.length+byteslen.length];
Log.d("CameraTest","byte[]: "+Arrays.toString(byteslen));
System.arraycopy(byteslen,0,bytesend,0,byteslen.length);
System.arraycopy(bytes,0,bytesend,byteslen.length,bytes.length);
ByteArrayInputStream inputstream = new ByteArrayInputStream(bytesend);
int amount;
while ((amount = inputstream.read(byteBuffer)) != -1) {
Log.d("CameraTest","amount: "+amount);
outsocket.write(byteBuffer, 0, amount);
}
myoutputstream.flush();
myoutputstream.close();
tempSocket.close();
接受视频数据的手机端:
Socket socket = mServerSocket.accept();
Log.d(TAG, "client is connect!!!");
DataInputStream is = new DataInputStream(socket.getInputStream());
byte[] buffer = new byte[2048];
int slen = 0;
slen = is.read(buffer);
Log.d(TAG,"slen: "+slen);
byte[] bufferlen = new byte[4];
System.arraycopy(buffer,0,bufferlen,0,bufferlen.length);
Log.d(TAG,"bufferlen[]:"+Arrays.toString(bufferlen));
int size = bytesToInt(bufferlen,0);
Log.d(TAG,"len: "+size);
byte[] databuffer = new byte[size];
System.arraycopy(buffer,4,databuffer,0,(buffer.length-4));
int len = slen-4;
while(len < size){
len += is.read(databuffer, len, size-len);
Log.d(TAG, "len is : "+len);
}
bm = BitmapFactory.decodeByteArray(databuffer, 0, databuffer.length);
if(bm == null){
Log.i(TAG, "服务器:bitmap为空");
}
handler.sendEmptyMessage(0x10);