最近项目用到了agora 来进行语音和视频通话。官网上写的是四行代码实现语音。其实的话中间还是有些问题存在的。就是建议使用demo里的workthread 和他的eventhandler 因为文档中说明 创建RtcEngine 和调用最好在一个线程。所以最后自己创建一个子线程用来创建对象和调用 join 什么的。这样不会有问题。
使用中遇到一个问题就是。两个手机无法加入一个频道内。不互通。后来发现是join里面有个参数uid 写死了。而一个频道内每个用户的uid 都是唯一的这个问题大家要注意。
而且当其他用户加入之后 并且获取到对方的第一针画面的时候再设置他的remoteview 这样比较符合逻辑。在eventhandler 的onFirstRemoteVideoDecoded 方法回调内 写
说了这么多我还是把流程简单说下。文档其实也很清晰。
第一步把下载的sdk demo里libs 下的拷到你项目对应目录。如果项目没有配置ndk 要配置ndk
第二步 就是按照文档 配置到join 加入频道。
rtcEngine=mp.create(this);
rtcEngine.enableAudio();
rtcEngine.enableVideo();
SurfaceView surfaceView=RtcEngine.CreateRendererView(getApplicationContext());
RelativeLayout.LayoutParams rlp=newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
rl_local.addView(surfaceView,rlp);
rtcEngine.setEncryptionSecret("nh");
rtcEngine.setEncryptionMode(Constant.entryMode);
rtcEngine.setupLocalVideo(newVideoCanvas(surfaceView,VideoCanvas.RENDER_MODE_HIDDEN,666));
rtcEngine.startPreview();
rtcEngine.joinChannel(null,"nh","",666);
从创建到 join 最好要在一个线程内执行 可以是子线程。注意创建SurfaceView 必须用他的createRendererview 方法。不能用自己写的surfaceview 。
首先设置本地图像 setupLocalVideo;对方图像在连接通了以后在设置
public voidonFirstRemoteVideoDecoded(final intuid2,intwidth,intheight,intelapsed) {
runOnUiThread(newRunnable() {
@Override
public voidrun() {
LinearLayout.LayoutParams rls2=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
SurfaceView sv2=RtcEngine.CreateRendererView(getApplicationContext());
ll_remote.addView(sv2,rls2);
VideoCanvas vc=new VideoCanvas(sv2,VideoCanvas.RENDER_MODE_HIDDEN,uid2);//这里要用回调方法里的uid 不是你加入频道的uid 是对方的才行。
rtcEngine.setupRemoteVideo(vc);
}
});
}
这里要在主线程调用 RunnOnuiThread 因为你要 将新创建的surfaceview 加入到你的acitivty里。基本流程到这里 就可以正常使用了 希望对要使用的小伙伴有个帮助。