android 简单视频通话

[b][size=18px]服务端[/size][/b]



public class XJCS {
	public short iPreviewWidth = 0;
	public short iPreviewHeight = 0;
	public short refreshRate = 50;// 刷新率 毫秒
	public byte imageQuality = 60;// 图像质量
	/**
	 * 0后 1前 摄像头
	 */
	public byte cameraID = 0;


}

public class SendHead
{
	public int cmd=0;
	public	int size=0;
	public	int csA=0;
	public int csB=0;


@Override
	public void onPreviewFrame(byte[] data, Camera camera) 
	{
			if(xjcs.refreshRate>0)
			{
				long l=System.currentTimeMillis();
				if(l<execuTime+xjcs.refreshRate)
				{
					return;
				}
				execuTime=l;
			}
			
		 YuvImg=new YuvImage(data, ImageFormat.NV21,xjcs.iPreviewWidth ,xjcs.iPreviewHeight, null); 
		 
		 byteArrOut.reset();
			try {
				YuvImg.compressToJpeg(img_rect, xjcs.imageQuality, byteArrOut);
			} catch (Exception e) {
				FF.scErr("img.compressToJpeg");
				e.printStackTrace();
				return;
			} 
			                               
			comByte=byteArrOut.toByteArray();
			sh5.size=comByte.length;// SendHead


			//----------将图标添加发送列队
			ssoc.SQ.add(sh5,comByte, sh5.size);
			ssoc.SQ.exec();
			
			//--------------------------
			comByte=null;
		
	}


[size=18px]发送列队[/size]
[code=java]
	public class XC_SendQueue extends Thread 
	{
		
		Object sync=new Object();
		
		LinkedList<struct_SendData> queue=new LinkedList<struct_SendData>();
		XC_SendQueue()
		{
			
		}
		
		 private boolean __break=false;
		 private boolean __Tstopped=false;
		private 	struct_SendData ssd;
		 
		public void add(byte[] byte_, int size) {
			ssd = new struct_SendData();
			ssd.data = byte_;
			ssd.size = size;
			queue.addFirst(ssd);
		}
		 
	
			public void add(SendHead sh,byte[] byte_, int size) {
				 ssd = new struct_SendData();
				ssd.data = toNetMsg?sh.toNetMsg():sh.toBytes();
				ssd.size = SendHead.HEADSIZE;
				queue.addFirst(ssd);
				
				 ssd = new struct_SendData();
				ssd.data = byte_;
				ssd.size = size;
				queue.addFirst(ssd);
			}
			
			
		 
		public void add(struct_SendData ssd_)
		{
			queue.addFirst(ssd_);
		}
		
		public boolean isAlive2()
		{
			return __Tstopped;
		}
		
		public void interrupt2()
		{
			__break=true;
			exec();
		}
		
		public void exec()
		{
			synchronized (sync) 
			{
				sync.notify();
			}
		}
		
		
		@Override
		public void run() 
		{
			struct_SendData sj;
			while(true)
			{
				
				synchronized (sync_send) 
				{
					
					while(!queue.isEmpty())
					{
						sj=queue.removeLast();
						try {
							outStream.write(sj.data,0,sj.size);
						} catch (IOException e) {
							e.printStackTrace();
							FF.scErr("IOException:45124");
						if(!setSocketError(SocketError.ERROR_IOEXCEPTION,"XC_SendQueue:IOException:123"))return;;
						
						}
					}
				}
				
				
				synchronized (sync) 
				{
					try {
						sync.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
						FF.scErr("sync.wait();");
						if(!setSocketError(SocketError.ERROR_IOEXCEPTION,"XC_SendQueue:synchronized (sync) :547"))return;;
					}
				}
				
				if(__break)break;
			}
			__Tstopped=true;		
			
		}
	}



[/code]
[size=18px]客户端
[/size]

连接到服务端

boolean  connectServer(String ip)
	{
		if(csoc.socket!=null){if(csoc.isIOException==false)return true;}
		//ff.toast("开始连接...");
	//	Socket soc=csoc.connectToServer("192.168.43.1",1234);
		
		if(ip!=null && ip.equals(""))ip=new String("192.168.43.1");
		if(ip==null)ip=new String("192.168.43.1");
		//ff.xxk(ip);
		Socket soc=csoc.connectToServer(ip,1234);
		
		  
		if(soc==null)
		{
			ff.xxk("连接失败");
			ll_control.setVisibility(View.VISIBLE);
			return false;
		}
		
		csoc.toNetMsg=false;
		csoc.initSocket(soc);
		csoc.setOnRecvSendHead(this);
		csoc.setOnSocketError(this);
		csoc.startRecv(recvBuffer);
		ff.setTitle("已连接 ");
		return true;
		
		
	}
	[/code]






[code=java]


	@Override
	public boolean onSocketReceivedData(SendHead sh, byte[] data,MySocket ___sssss) 
	{
		switch (sh.cmd) {  
		case command.ML_FILE_Picture:
			{
					 Gbmp=BitmapFactory.decodeByteArray(data, 0, sh.size);
					 chan.sendEmptyMessage(chan.msgImgPreviewShowBitmap);
			}break;


			return true;
	}
[/code]





https://pan.baidu.com/s/1w3N7x9od3D9biK2eFeZGvQ





猜你喜欢

转载自blog.csdn.net/u011976780/article/details/80225283