android 音视频通信Demo

最近学习Android平台下跨平台音视频通信开发,虽然网上有很多开源项目供我们参考学习,但音视频效果很一般,还有很多不稳定的因素,毕竟是开源嘛。在国内我找到了一个比较好音视频通信解决方案(百度下载官方Anychat demo),该案例提供了纯Java语言接口供我们调用,随后我参照官方android demo程序和开发文档并结合自己的见解写了一个android音频通信 软件 ,200行以内代码就搞定了(难以相信吧)。其实我只是调用其相关API即可实现。以下是我自己写的Java代码,以备大家互相学习:
  1. 1./**  
  2. 2. * Android**天   
  3. 3. * 1、初始化SDK 2、连接服务器、 3、用户登录;4、进入房间;5、打开本地视频;6、请求对方视频  
  4. 4. */  
  5. 5.public class VideoChatActivity extends Activity implements AnyChatBaseEvent   
  6. 6.{   
  7. 7.    private AnyChatCoreSDK anychat;         // 核心SDK   
  8. 8.    private SurfaceView remoteSurfaceView;  // 对方视频   
  9. 9.    private SurfaceView localSurfaceView;   // 本地视频   
  10. 10.    private ConfigEntity configEntity;   
  11. 11.    private boolean bSelfVideoOpened = false;   // 本地视频是否已打开   
  12. 12.    private boolean bOtherVideoOpened = false;  // 对方视频是否已打开   
  13. 13.    private TimerTask mTimerTask;               // 定时器   
  14. 14.    private Timer mTimer = new Timer(true);   
  15. 15.    private Handler handler;                    // 用Handler来不间断刷新即时视频   
  16. 16.    private List<String> userlist = new ArrayList<String>();//保存在线用户列表   
  17. 17.    private int userid;                         // 用户ID   
  18. 18.    @Override  
  19. 19.    public void onCreate(Bundle savedInstanceState)   
  20. 20.    {   
  21. 21.        super.onCreate(savedInstanceState);   
  22. 22.        setContentView(R.layout.activity_video_chat);   
  23. 23.        remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);   
  24. 24.        localSurfaceView = (SurfaceView) findViewById(R.id.surface_local);   
  25. 25.        configEntity = ConfigService.LoadConfig(this);//加载视频通话设置   
  26. 26.        loginSystem();// 初始化SDK 连接服务器   
  27. 27.        mTimerTask = new TimerTask(){   
  28. 28.            public void run(){   
  29. 29.                Message mesasge = new Message();   
  30. 30.                handler.sendMessage(mesasge);   
  31. 31.            }   
  32. 32.        };   
  33. 33.        mTimer.schedule(mTimerTask, 1000, 100);   
  34. 34.        handler = new Handler(){   
  35. 35.            @Override  
  36. 36.            public void handleMessage(Message msg){   
  37. 37.                VideoChat();// 不间断显示即时视频通话画面   
  38. 38.                super.handleMessage(msg);   
  39. 39.            }   
  40. 40.        };   
  41. 41.    }   
  42. 42.    // 初始化SDK 连接服务器   
  43. 43.    private void loginSystem(){   
  44. 44.        if (anychat == null){   
  45. 45.            anychat = new AnyChatCoreSDK();   
  46. 46.            anychat.SetBaseEvent(this);         // 设置基本事件回调函数   
  47. 47.            if (configEntity.useARMv6Lib != 0)  // 使用ARMv6指令集   
  48. 48.                anychat.SetSDKOptionInt(AnyChatDefine.   
  49. 49.                        BRAC_SO_CORESDK_USEARMV6LIB, 1);   
  50. 50.            anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK   
  51. 51.        }   
  52. 52.        anychat.Connect("demo.anychat.cn", 8906);// 连接服务器   
  53. 53.    }   
  54. 54.    // 显示即时视频通话画面   
  55. 55.    public void VideoChat(){   
  56. 56.        if (!bOtherVideoOpened){   
  57. 57.            if (anychat.GetCameraState(userid) == 2  
  58. 58.                    && anychat.GetUserVideoWidth(userid) != 0){   
  59. 59.                SurfaceHolder holder = remoteSurfaceView.getHolder();   
  60. 60.                holder.setFormat(PixelFormat.RGB_565);   
  61. 61.                holder.setFixedSize(anychat.GetUserVideoWidth(userid),   
  62. 62.                        anychat.GetUserVideoHeight(userid));   
  63. 63.                Surface s = holder.getSurface();            // 获得视频画面   
  64. 64.                anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 调用API显示视频画面   
  65. 65.                bOtherVideoOpened = true;   
  66. 66.            }   
  67. 67.        }   
  68. 68.        if (!bSelfVideoOpened){   
  69. 69.            if (anychat.GetCameraState(-1) == 2  
  70. 70.                    && anychat.GetUserVideoWidth(-1) != 0){   
  71. 71.                SurfaceHolder holder = localSurfaceView.getHolder();   
  72. 72.                holder.setFormat(PixelFormat.RGB_565);   
  73. 73.                holder.setFixedSize(anychat.GetUserVideoWidth(-1),   
  74. 74.                        anychat.GetUserVideoHeight(-1));   
  75. 75.                Surface s = holder.getSurface();   
  76. 76.                anychat.SetVideoPos(-1, s, 0, 0, 0, 0);   
  77. 77.                bSelfVideoOpened = true;   
  78. 78.            }   
  79. 79.        }   
  80. 80.    }   
  81. 81.    public void OnAnyChatConnectMessage(boolean bSuccess){   
  82. 82.        if (!bSuccess){   
  83. 83.            Toast.makeText(VideoChatActivity.this, "连接服务器失败,自动重连,请稍后...", Toast.LENGTH_SHORT).show();   
  84. 84.        }   
  85. 85.        anychat.Login("android", "");               // 服务器连接成功 用户登录   
  86. 86.    }   
  87. 87.    public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){   
  88. 88.        if (dwErrorCode == 0) {   
  89. 89.            Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();   
  90. 90.            anychat.EnterRoom(1, "");               // 用户登录成功 进入房间   
  91. 91.            ApplyVideoConfig();   
  92. 92.        } else {   
  93. 93.            Toast.makeText(this, "登录失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
  94. 94.        }   
  95. 95.    }   
  96. 96.    public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){   
  97. 97.        if (dwErrorCode == 0) {                     // 进入房间成功  打开本地音视频   
  98. 98.            Toast.makeText(this, "进入房间成功", Toast.LENGTH_SHORT).show();   
  99. 99.            anychat.UserCameraControl(-1, 1);       // 打开本地视频   
  100. 100.            anychat.UserSpeakControl(-1, 1);        // 打开本地音频   
  101. 101.        } else {   
  102. 102.            Toast.makeText(this, "进入房间失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
  103. 103.        }   
  104. 104.    }   
  105. 105.    public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){   
  106. 106.        if (dwRoomId == 1){   
  107. 107.            int user[] = anychat.GetOnlineUser();   
  108. 108.            if (user.length != 0){   
  109. 109.                for (int i = 0; i < user.length; i++){   
  110. 110.                    userlist.add(user[i]+"");   
  111. 111.                }   
  112. 112.                String temp =userlist.get(0);   
  113. 113.                userid = Integer.parseInt(temp);   
  114. 114.                anychat.UserCameraControl(userid, 1);// 请求用户视频   
  115. 115.                anychat.UserSpeakControl(userid, 1); // 请求用户音频   
  116. 116.            }   
  117. 117.            else {   
  118. 118.                Toast.makeText(VideoChatActivity.this, "当前没有在线用户", Toast.LENGTH_SHORT).show();   
  119. 119.            }   
  120. 120.        }   
  121. 121.    }   
  122. 122.    public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){   
  123. 123.        if (bEnter) {//新用户进入房间   
  124. 124.            userlist.add(dwUserId+"");   
  125. 125.        }   
  126. 126.        else {       //用户离开房间   
  127. 127.            if (dwUserId == userid)   
  128. 128.            {   
  129. 129.                Toast.makeText(VideoChatActivity.this, "视频用户已下线", Toast.LENGTH_SHORT).show();   
  130. 130.                anychat.UserCameraControl(userid, 0);// 关闭用户视频   
  131. 131.                anychat.UserSpeakControl(userid, 0); // 关闭用户音频   
  132. 132.                userlist.remove(userid+"");          //移除该用户   
  133. 133.                if (userlist.size() != 0)   
  134. 134.                {   
  135. 135.                    String temp =userlist.get(0);   
  136. 136.                    userid = Integer.parseInt(temp);   
  137. 137.                    anychat.UserCameraControl(userid, 1);// 请求其他用户视频   
  138. 138.                    anychat.UserSpeakControl(userid, 1); // 请求其他用户音频   
  139. 139.                }   
  140. 140.            }   
  141. 141.            else {   
  142. 142.                userlist.remove(dwUserId+"");    //移除该用户   
  143. 143.            }   
  144. 144.        }   
  145. 145.    }   
  146. 146.    public void OnAnyChatLinkCloseMessage(int dwErrorCode){   
  147. 147.        Toast.makeText(VideoChatActivity.this, "连接关闭,error:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
  148. 148.    }   
  149. 149.    @Override  
  150. 150.    protected void onDestroy(){ //程序退出    
  151. 151.        anychat.LeaveRoom(-1);  //离开房间    
  152. 152.        anychat.Logout();       //注销登录    
  153. 153.        anychat.Release();      //释放资源   
  154. 154.        mTimer.cancel();   
  155. 155.        super.onDestroy();   
  156. 156.    }   
  157. 157.    // 根据配置文件配置视频参数   
  158. 158.    private void ApplyVideoConfig(){   
  159. 159.        if (configEntity.configMode == 1) // 自定义视频参数配置   
  160. 160.        {   
  161. 161.            // 设置本地视频编码的码率(如果码率为0,则表示使用质量优先模式)   
  162. 162.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL,configEntity.videoBitrate);   
  163. 163.            if (configEntity.videoBitrate == 0)   
  164. 164.            {   
  165. 165.                // 设置本地视频编码的质量   
  166. 166.                anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL,configEntity.videoQuality);   
  167. 167.            }   
  168. 168.            // 设置本地视频编码的帧率   
  169. 169.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL,configEntity.videoFps);   
  170. 170.            // 设置本地视频编码的关键帧间隔   
  171. 171.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL,configEntity.videoFps * 4);   
  172. 172.            // 设置本地视频采集分辨率   
  173. 173.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL,configEntity.resolution_width);   
  174. 174.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL,configEntity.resolution_height);   
  175. 175.            // 设置视频编码预设参数(值越大,编码质量越高,占用CPU资源也会越高)   
  176. 176.            anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL,configEntity.videoPreset);   
  177. 177.        }   
  178. 178.        // 让视频参数生效   
  179. 179.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM,configEntity.configMode);   
  180. 180.        // P2P设置   
  181. 181.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC,configEntity.enableP2P);   
  182. 182.        // 本地视频Overlay模式设置   
  183. 183.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY,configEntity.videoOverlay);   
  184. 184.        // 回音消除设置   
  185. 185.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL,configEntity.enableAEC);   
  186. 186.        // 平台硬件编码设置   
  187. 187.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC,configEntity.useHWCodec);   
  188. 188.        // 视频旋转模式设置   
  189. 189.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL,configEntity.videorotatemode);   
  190. 190.        // 视频平滑播放模式设置   
  191. 191.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE,configEntity.smoothPlayMode);   
  192. 192.        // 视频采集驱动设置   
  193. 193.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER,configEntity.videoCapDriver);   
  194. 194.        // 本地视频采集偏色修正设置   
  195. 195.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA,configEntity.fixcolordeviation);   
  196. 196.        // 视频显示驱动设置   
  197. 197.        anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL,configEntity.videoShowDriver);   
  198. 198.    }   
  199. 199.}  
复制代码
该Android音视频解决方案还有文字聊天、发送文件、P2P连接等非常实用的功能。对于开发者来说,能快速实现类似QQ聊天和音视频通信是令人振奋的事情。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值