前言
如果让你实现一个Android 多人视频功能,就像微信、QQ中的功能,你会怎么实现?我想大多数同学都是束手无策,不知道从何下手。但是你如果知道AnyRTC,实现这个功能,就很easy啦!简直不要太简单!
AnyRTC
- AnyRTC官网
- AnyRTC 开发者中心
- 全球互联,身临其境
四行代码,30分钟,在应用内构建语音通话、视频通话、互动直播、实时消息。
-
一个SDK,4行代码轻松创建实时互动场景:
mRtcEngine = RtcEngine.create(context, appid, eventHandler); mRtcEngine.setupLocalVideo(videoCanvas); mRtcEngine.enableVideo(); mRtcEngine.joinChannel(token, channelName, info, uid);
上面四行代码就可以实现实时通话了,是不是很简单!
- 不仅支持Android,还支持Web、IOS&Mac/Windows
Android代码示例
1.demo演示
这里我就不做演示了,扫描下方二维码既可以下载多人视频demo,里面功能有:一对一呼叫语音、视频、多人视频。自行查看。
2.呼叫代码示例
这个demo是以呼叫的形式来实现多人视频的。模仿微信的流程。
1.首先我们需要加入依赖库
implementation 'org.ar:rtc:4.0.1.0' //RTC的依赖库
implementation 'org.ar:rtm:1.0.0.8' //RTM的依赖库
2.创建一个Client实例
rtmClient = RtmClient.createInstance(context, appId, new RtmClientListener() {
@Override
public void onConnectionStateChanged(int state, int reason) {
}
@Override
public void onMessageReceived(RtmMessage rtmMessage, String s) {
}
@Override
public void onTokenExpired() {
}
@Override
public void onPeersOnlineStatusChanged(Map<String, Integer> map) {
}
});
上面代码是创建一个RtmClient实例和一些回调。比如onConnectionStateChanged就是监听连接的状态变化.
可以参考:AnyRTC官网文档
3. RtmCallManager实例获取rtmCallManager=rtmClient.getRtmCallManager();
rtmCallManager=rtmClient.getRtmCallManager();
rtmClient 就是上一段代码获取的Client实例。
4.创建事件的监听器
rtmCallManager.setEventListener(new RtmCallEventListener() {
//返回给主叫的回调:被叫已收到呼叫邀请。
@Override
public void onLocalInvitationReceivedByPeer(LocalInvitation var1) {
}
//返回给主叫的回调:被叫已接受呼叫邀请。
@Override
public void onLocalInvitationAccepted(LocalInvitation var1, String var2) {
}
//返回给主叫的回调:被叫已拒绝呼叫邀请。
@Override
public void onLocalInvitationRefused(LocalInvitation var1, String var2) {
}
//返回给主叫的回调:呼叫邀请已被成功取消。
@Override
public void onLocalInvitationCanceled(LocalInvitation var1) {
}
//返回给主叫的回调:发出的呼叫邀请过程失败。
@Override
public void onLocalInvitationFailure(LocalInvitation var1, int var2) {
}
//返回给被叫的回调:收到一条呼叫邀请。SDK 会同时返回一个 RemoteInvitation 对象供被叫管理。
@Override
public void onRemoteInvitationReceived(RemoteInvitation var1) {
}
//返回给被叫的回调:接受呼叫邀请成功。
@Override
public void onRemoteInvitationAccepted(RemoteInvitation var1) {
}
//返回给被叫的回调:拒绝呼叫邀请成功。
@Override
public void onRemoteInvitationRefused(RemoteInvitation var1) {
}
//返回给被叫的回调:主叫已取消呼叫邀请。
@Override
public void onRemoteInvitationCanceled(RemoteInvitation var1) {
}
//返回给被叫的回调:来自主叫的邀请过程失败。
@Override
public void onRemoteInvitationFailure(RemoteInvitation var1, int var2) {
}
});
这些监听回调,就是你所打电话的主叫和被叫返回你所有的值,得到这些值来做一些逻辑上的操作。
3.视频代码示例
1.创建实例RtcEngine
try {
mRtcEngine = RtcEngine.create(getBaseContext(), RTC_APPID, mRtcEventHandler);
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
throw new RuntimeException("NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e));
}
其中RTC_APPID是你所需要去官网申请的。后面的IRtcEngineEventHandler是一些回调
2.创建IRtcEngineEventHandler实例
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
//加入频道成功
@Override
public void onJoinChannelSuccess(String channel, final String uid, int elapsed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//有用户加入
@Override
public void onUserJoined(String uid, int elapsed) {
super.onUserJoined(uid, elapsed);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//视频解码第一帧
@Override
public void onFirstRemoteVideoDecoded(final String uid, int width, int height, int elapsed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//有用户离开
@Override
public void onUserOffline(final String uid, int reason) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//远程视频状态改变的回调
@Override
public void onRemoteVideoStateChanged(String uid, int state, int reason, int elapsed) {
super.onRemoteVideoStateChanged(uid, state, reason, elapsed);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//远程语音状态改变的回调
@Override
public void onRemoteAudioStateChanged(String uid, int state, int reason, int elapsed) {
super.onRemoteAudioStateChanged(uid, state, reason, elapsed);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
};
回调做一些逻辑操作,一般在子线程中运行。
3.设置视频的配置
mRtcEngine.enableVideo(); //开启视频
mRtcEngine.setVideoEncoderConfiguration(new VideoEncoderConfiguration(
VideoEncoderConfiguration.VD_640x480,
VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15,
VideoEncoderConfiguration.STANDARD_BITRATE,
VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT));
4.加入房间
private void joinChannel() {
mRtcEngine.enableDualStreamMode(true);
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
mRtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER);
mRtcEngine.joinChannel("", "房间ID", "Extra Optional Data",userMultiId);
mRtcEngine.setEnableSpeakerphone(true);
}
两个人必须加入同一个频道,才能通讯。
5.设置本地视频
TextureView mLocalView = mRtcEngine.CreateRendererView(getBaseContext());
mRtcEngine.setupLocalVideo(new VideoCanvas(mLocalView, Constants.RENDER_MODE_HIDDEN,"房间ID", "自己ID",Constants.VIDEO_MIRROR_MODE_AUTO));
mRtcEngine.startPreview();
需要创建一个TextureView来存放本地的视频画面。
5设置远程视频
TextureView mRemoteView = mRtcEngine.CreateRendererView(getBaseContext());
mRtcEngine.setRemoteVideoStreamType(uid,1); //设置大小流
mRtcEngine.setupRemoteVideo(new VideoCanvas(mRemoteView,Constants.RENDER_MODE_HIDDEN, "房间ID", "自己ID",Constants.VIDEO_MIRROR_MODE_DISABLED));
最后只需要把远程视频,放到IRtcEngineEventHandler的onUserJoined或onFirstRemoteVideoDecoded回调中就可以进行通话视频了。
待更新,源码地址稍后加上