AnyRTC---Android 实现多人视频

603 阅读4分钟

前言

如果让你实现一个Android 多人视频功能,就像微信、QQ中的功能,你会怎么实现?我想大多数同学都是束手无策,不知道从何下手。但是你如果知道AnyRTC,实现这个功能,就很easy啦!简直不要太简单!

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));

最后只需要把远程视频,放到IRtcEngineEventHandleronUserJoinedonFirstRemoteVideoDecoded回调中就可以进行通话视频了。

待更新,源码地址稍后加上