前两天,图鸭君给大家介绍了如何在 iOS 端搭建音视频通信系统,今天我就给大家介绍一下如何搭建一个完整的 Android 音视频通信系统。
一、准备:
首先在图鸭官网: http://tucodec.com 进行注册,获得 SDK 中所需要的 AppKey、AppSecret.
其次到开发者里选择下载 android 中所需 SDK
最后解压.
voip_android_demo1.0 是用于演示的 demo,图鸭君也将要按照这个 demo 以及 SDK 开发文档进行讲解,打开 resource 资源文件
将 voip_android.aar 提取出来导入到工程,里面包含了提供相关操作的 java 类以及 so 库,配置相关的环境。
导入” voip_android.aar ”文件 在“ libs ”文件夹下添加 aar 包,在 build 文件夹下添加: repositories { flatDir { dirs 'libs' } }
在 dependencies 下添加: compile(name: 'voip_android', ext: 'aar')
配置其他三方库 在 gradle 文件里面的 dependencies 下添加下面三方库: api "com.alibaba:fastjson:1.1.63.android"
加入权限 AndroidManifest.xml 加入以下权限: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
完成上述操作后,我们的音视频通讯 App 所需的大体框架已经完成啦,之后就是码代码,完成系统 UI 界面绘制和用户之间通讯的逻辑操作。
在图鸭科技提供的 SDK 中,我们可以看到只需要调用三个类进行操作,可见快速集成音视频通信并不是那么复杂。
二、操作类定义:
1、TYVoipAndroid:提供所有 Voip 相关方法 2、TYVoipVideoCapture:摄像头管理类 3、TYVoipVideoRender:Voip 客户端视频渲染视图.,渲染在此视图上进行
了解上述主要接口文件及其定义后,我们来了解 SDK 中的通信原理:在 SDK 中,所有用户都以通讯节点的形式存在,作为节点的用户都拥有自己唯一的表示—— UserID,整个 SDK 会根据每个用户的 UserID 来进行通讯。
例如,甲和乙之间进行通讯,假设甲的 UserID 为 401,乙的 UserID 为 402,甲登录后向乙发送我要和你开视频,乙登录后向甲发送我要和你开视频,甲开始渲染乙的视图,乙开始渲染甲的视图 。完成上述所有操作后,甲乙建立通讯。
三、完整的 SDK 使用步骤简介:
<1>初始化 TYVoipAndroid、TYVoipVideoCapture 类:
mTYVoipAndroid = new TYVoipAndroid(new Handler(), Context,null);
mVideoCapture = TYVoipVideoCapture(mTYVoipAndroid ,
TYVoipVideoCapture.CaptureParam(mTYVoipAndroid.config.videoWidth,
mTYVoipAndroid.config.videoHeight));
<2>登录转发服务器(建议写成单例,一次登录,多次调用): loginRelayServer(String ip, short port, int userId, int sessionId, int AppKey, int AppSecret);
<3>开启相机,注册音视频回调,初始化 Voip 客户端,开启传输 mVideoCapture.start(false, mTYVoipAndroid.config, mMainRender.parent as ViewGroup); mTYVoipAndroid.registerVideoCallback(mVideoCallback); mTYVoipAndroid.registerAudioCallback(mAudioCallback); mTYVoipAndroid.initVoip(mVideoCapture); mTYVoipAndroid.startVoip(int videoBitRate, int audioBitRate, int userId);
<4>根据逻辑,添加(删除)需要通话的节点: mTYVoipAndroid.addClientNode(int userId); //mTYVoipAndroid.removeClientNode(int userId);
<5>不需要通话时,停止 voip: mTYVoipAndroid.stopCall() //清空现有的连接节点(不再接收节点的数据) mTYVoipAndroid.clearClientNodeList();
<6>根据具体的业务逻辑重复步骤 3、4、5
<7>在程序结束时销毁 voip mTYVoipAndroid.release()
四、部分代码解释:(从用户甲的实现代码来解释)
private TYVoipVideoRender preView; //渲染甲的视图 private TYVoipVideoRender otherView; //渲染乙的视图
<1>登录操作: 甲( UserID:401 )登录操作,返回值为是否登录成功(非 0 即为成功):
/** *连接转发服务器 *@param ip @param 端口号 @param userId @param sessionId *@param AppKey @param AppSecret @return !0 即为成功 */ mTYVoipAndroid.loginRelayServer(ip, port, 401, sessionId, AppKey, AppSecret);
<2>连接操作 甲连接乙操作: ...一系列操作 / //甲自己加入到通讯中 mTYVoipAndroid.startVoip(512, 16000, 401); //添加节点(添加乙的 USerID ) mTYVoipAndroid.addClientNode(402);
//在 videoCallBack 上进行视图渲染
private TYVoipAndroid.VideoCallback mVideoCallback = new TYVoipAndroid.VideoCallback() { @Override public void renderVoipVideoData(VoipImage voipImage) { if (voipImage.isLocal){ //本地视频渲染(甲的数据流) preView.pushVideoFrame(voipImage); }else { //非本地视频渲染(乙的数据流) otherView.pushVideoFrame(voipImage); } } }; //在 audioCallBack 回调方法目前还未用到,忽视此回调
<3>断开操作 甲进行断开通信操作 //停止相机视频捕捉 mVideoCapture.stop() //清空现有的连接节点(不再接收节点的数据) mTYVoipAndroid.clearClientNodeList(); //结束 Voip 通话 mTYVoipAndroid.stopCall() //释放资源 mTYVoipAndroid.release()
项目中最重要的代码介绍完啦,一套完整的 android 音视频通信系统就完成了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.