原网址:http://www.haolizi.net/example/view_3075.html#download

【核心代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
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();
                }
            }
        }
    }
}

android视频聊天源码下载(wifi)相关推荐

  1. Android视频直播源码开发直播平台、点播播放器哪家强?

    Android视频直播源码开发直播平台.点播播放器哪家强? 最近在项目中要加入视频直播和点播功能,那么问题来了,我需要一个播放器来播放视频流,那该如何选择呢?除了原生的VideoView(VideoV ...

  2. 视频聊天源码,IOS 保存图片、视频到自定义相簿

    视频聊天源码,IOS 保存图片.视频到自定义相簿实现的相关代码 1.检测相簿以及创建相簿: /** 创建自定义相册 */ +(void)isExistFolder:(NSString * _Nonnu ...

  3. 视频聊天源码开发,如何进行代码优化

    前言 公司的视频聊天源码,有不少类14年的代码也有,可谓见证了该项目的持续辉煌,结果一搜,有些类没有被调用,看来当年的开发者不忍心删掉,就持续到现在了.我相信不少项目都会出现这种情况,要么先注释掉,要 ...

  4. I.MX6 android 4.2 源码下载

    /************************************************************************** I.MX6 android 4.2 源码下载* ...

  5. 一对一 视频聊天源码,不要小瞧社交平台的盈利方式

    视频聊天源码的出现填补了社交行业没有代表型软件的空缺,它不仅提升了交友双方的交互性,还有效稳定了推广.收益方式.尽管现在娱乐软件都有些倾向于社交软件的发展,但事实证明,它们的社交方式完全不够,无法满足 ...

  6. android4.4.4linux内核下载,Android 4.4源码下载

    Android 4.4源码下载(linux合并) ==============================分割线结束========================= 旧版本的可以使用115,不想 ...

  7. 一对一视频聊天源码中的语言包应该如何开发

    作为专业的一对一视频聊天源码开发服务商,与国外客户打交道是必不可少的,但是由于语言不同所以在开发和后期搭建部署时会遇到一些障碍. 除此之外还需要考虑国外客户在其所在国家上线运营时的语言问题,这就需要开 ...

  8. 课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)

    课程名称: 鸿蒙HarmonyOS系统及物联网开发实战课程 课程介绍: HarmonyOS 是一款面向万物互联时代的.全新的分布式操作系统.在传统的单设备系统能力基础上,HarmonyOS 提出了基于 ...

  9. 【Android】Android 4.2源码下载(ubuntu 12.10)

    前沿 最近在研究NFC,这个不同在不同版本中API的使用都不同,想看下其源码实现,于是乎得重新下载下android源码了~~~ 完整步骤 Installing some soft 1 Install ...

最新文章

  1. 智慧电梯物联网 未来电梯将更智能
  2. 戴上脑机接口头盔,他用大脑跟别人「说话」
  3. 海思3559 人脸识别
  4. 5 在java等于多少,java基础面试题之Java中的Math. round(-1. 5)等于多少
  5. java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...
  6. 给控件做数字签名之三:进行数字签名
  7. 多元样条函数及其应用_B样条算法(B-spline)
  8. 图表框架HelloCharts(3)饼状图
  9. native关键字(涉及本地方法栈)
  10. 全国计算机二级C 错题/知识点整理
  11. repo start master --all 和repo start --all master区别
  12. NYOJ题目1045看美女
  13. 用gambit学博弈论--完全信息动态博弈-博弈扩展式、博弈树(二)
  14. ug10.0安装好了怎么找到
  15. Python 实验三 使用 TCP 实现智能聊天机器人
  16. 微信支付-JASPI:准备工作[微信公众平台配置,微信商户平台配置]
  17. HTML+CSS基础学习笔记1
  18. 排除万难,从入门到精通区块链
  19. 华为OD机试 - 不含101的数
  20. 远程服务器访问 JupyterLab

热门文章

  1. qt Type defaults to ‘int‘ in declaration of
  2. 墨天轮高分技术文档分享——数据库安全篇(共48个)
  3. docker查找占用主机磁盘空间最大的容器
  4. cPanel主机空间安装Magento规范准确详细教程
  5. 如何使用MYSQL触发器,备份历史记录?
  6. 有限元悬臂梁matlab,悬臂梁MATLAB有限元算例注释.doc
  7. 学习数字电路-时序约束
  8. 网络下载器 Internet Download Manager v6.35.5 绿色便携版
  9. 易语言从c盘开始搜索文件,全盘搜索查找指定文件
  10. BOSS系统技术架构