实例介绍
【实例简介】支持 wifi下 视频 语音聊天
【实例截图】
【核心代码】
public class VideoChat extends Base implements SurfaceHolder.Callback, Camera.PreviewCallback,OnBitmapLoaded{ private SurfaceHolder surfaceHolder; private SurfaceView surfaceView; private Camera camera; private VideoView myView; private String chatterIP;//记录当前用户ip //线程池,用来发送图片数据 private ExecutorService executors=Executors.newFixedThreadPool(TCPVideoReceiveListener.THREAD_COUNT); final int REFRESH=0; private int port=Constant.VIDEO_PORT; private TCPVideoReceiveListener videoReceiveListener; private UDPVoiceListener voiceListener; private boolean stop;//标识activity被遮挡 private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { myView.setBitmap((Bitmap)msg.obj); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.video_chat1); findViews(); chatterIP=getIntent().getStringExtra("IP"); try { voiceListener=UDPVoiceListener.getInstance(InetAddress.getByName(chatterIP)); voiceListener.open(); } catch (Exception e) { e.printStackTrace(); showToast("抱歉,语音聊天器打开失败"); try { voiceListener.close(); } catch (IOException e1) { e1.printStackTrace(); } } new Thread(new Runnable() { @Override public void run() { try { videoReceiveListener=TCPVideoReceiveListener.getInstance(); videoReceiveListener.setBitmapLoaded(VideoChat.this); if(!videoReceiveListener.isRunning()) videoReceiveListener.open();//先监听端口,然后连接 } catch (IOException e1) { e1.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { showToast("非常抱歉,视屏连接失败"); finish(); } }); } } }).start(); SpotManager.getInstance(this).showSpotAds(this); } private void findViews(){ surfaceView=(SurfaceView) findViewById(R.id.video_chat_preview); surfaceHolder=surfaceView.getHolder(); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceHolder.addCallback(this); myView=(VideoView) findViewById(R.id.video_chat_myview); TextView topTitle=(TextView) findViewById(R.id.toptextView); topTitle.setText(getIntent().getStringExtra("name")); } @Override protected void onPause() { stop=true; super.onPause(); } @Override public void onPreviewFrame(final byte[] data, final Camera camera) { executors.execute(new Runnable() { @Override public void run() { try { Socket socket=new Socket(InetAddress.getByName(chatterIP), port); OutputStream out=socket.getOutputStream(); YuvImage image = new YuvImage(data, 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); // Bitmap bmp = Util.decodeSampledBitmapFromFile(os.toByteArray(), 200, 200); // Bitmap bmp=BitmapFactory.decodeByteArray(data, offset, length, opts) Matrix matrix=new Matrix(); matrix.setRotate(-90); // matrix.postScale(2.0f, 2.0f); //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(); } catch (IOException e) { e.printStackTrace(); } } }); } @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(); } } } @Override public void surfaceCreated(SurfaceHolder holder) { 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; } } int w ; //宽度 int h; int PreviewFormat; @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { 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); // if (Integer.parseInt(Build.VERSION.SDK) >= 8) { // setDisplayOrientation(camera, 90); // } else { // if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // parameters.set("orientation", "portrait"); // parameters.set("rotation", 90); // }else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // parameters.set("orientation", "landscape"); // parameters.set("rotation", 90); // } // } camera.setPreviewCallback(this); camera.setParameters(parameters); camera.startPreview();//开始预览 } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(camera!=null){ camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera=null; } } protected void setDisplayOrientation(Camera camera, int angle) { 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(); } } @Override protected void onDestroy() { super.onDestroy(); try { videoReceiveListener.close(); voiceListener.close(); } catch (Exception e) { e.printStackTrace(); } } /** * socket池,用来缓存 */ @Deprecated class SocketPool extends Thread{ private List<Socket> sockets=new LinkedList<Socket>(); private final int poolSize=30; private boolean go=true; @Override public void run() { InetAddress address = null; try { address = InetAddress.getByName(chatterIP); while(go){ int count=sockets.size(); if(count<poolSize){ for(int i=0;i<poolSize-count;i ){ sockets.add(new Socket(address, port)); } } } } catch (IOException e) { e.printStackTrace(); } } public Socket getSocket(){ if(!sockets.isEmpty()){ Socket socket=sockets.get(0); sockets.remove(0); return socket; } return null; } public void close(){ go=false; for(Socket socket:sockets){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)