客户端实现
更新时间: 2024/08/02 11:26:48
网易云信音视频通话 2.0 产品为您提供开源的多人视频通话示例项目,您可以参考示例项目源码和本文档快速实现多人视频通话的主要流程步骤,体验 NERTC SDK 的多人实时音视频通话的效果。
前提条件
请确保您已完成以下操作:
- 已创建应用并获取 App Key。
- 已开通音视频通话 2.0 服务。
- 已集成 NERTC SDK。
- 在云信控制台中为指定应用开通调试模式。
注意事项
- 集成开发阶段,建议在控制台中将指定应用的鉴权方式设置为调试模式,此时无需传入 Token 即可加入房间。但是出于安全性考虑,应用正式上线前,请在控制台中将指定应用的鉴权方式改回安全模式。
- 本文档中仅展示多人视频通话的主要流程和对应核心代码片段,代码样例与 Demo 中的源码不完全一致,您也可以直接参考 Demo 源码实现多人视频通话功能。
API 时序图
实现多人视频通话
1 初始化 SDK
-
设置音视频参数和属性。
在初始化之前,您可以根据不同场景下的用户喜好与需求,设置音视频的基本属性,具体请参见音视频参数配置推荐。音频可设置采样率、码率和编码模式等,视频可设置分辨率、帧率、码率的档位,裁剪模式等参数。
-
初始化 NERTC SDK。
调用
init
方法完成初始化,初始化之后才能调用 NERTC 的其他接口。// 配置一个 NERtcVideoConfig 实例,参数可参考下文中的 API 参考链接 NERtcVideoConfig videoConfig = new NERtcVideoConfig(); videoConfig.frontCamera = mFrontCamera; .... NERtcEx.getInstance().setLocalVideoConfig(videoConfig); //设置本地视频参数 NERtcEx.getInstance().setParameters(mRtcParameters); //先设置参数,后初始化 NERtcEx.getInstance().setAudioProfile(mAudioProfile,mAudioScenario);//初始化前设置音频场景 // 初始化 SDK NERtcEx.getInstance().init(getApplicationContext(),Config.APP_KEY,callback,null)
为了实现标准音视频通话业务,您还需要在初始化时注册相关必要回调,建议您请在初始化方法中传入原型为 NERtcCallbackEx 的以下回调,并增加相应必要的处理。
//NERtcCallbackEx 重要回调 //本端用户加入房间结果回调 @Override public void onJoinChannel(int result, long channelId, long elapsed, long uid) { if (result == NERtcConstants.ErrorCode.OK) { // 加入房间成功 } else { // 加入房间失败 ,退出页面 } } //本端用户离开房间回调 @Override public void onLeaveChannel(int result) { } //远端用户加入房间 @Override public void onUserJoined(long uid) { } //远端用户离开房间 @Override public void onUserLeave (long uid,int reason) { } //远端用户打开音频 @Override public void onUserAudioStart(long uid) { } //远端用户关闭音频 @Override public void onUserAudioStop(long uid) { } //远端用户打开视频,建议在此按需设置画布及订阅视频 @Override public void onUserVideoStart(long uid,int maxProfile) { } //远端用户关闭视频,可释放之前绑定的画布 @Override public void onUserVideoStop(long uid) { } //与服务器断连,退出页面 @Override public void onDisconnect(int reason) { }
2 开始视频通话
-
加入房间。
完成初始化后,调用
joinChannel
方法加入房间。SDK 发起加入房间请求后,NERTC 服务器会进行响应,开发者可以通过
NERtcCallback
的onJoinChannel
回调监听加入房间的结果,同时该回调会抛出当前通话房间的 channelId 与加入房间总耗时(毫秒)。您也可以通过信令实现通话中的邀请机制。
-
设置本地视图。
您可以在加入房间前或加入房间后设置本地视图,以便在通话中看到本地图像。本文档以加入房间后为例演示设置本地视图的步骤:
- 调用
setupLocalVideoCanvas
方法设置本地视图。 - 调用
enableLocalVideo(streamType)
方法进行视频的采集发送与预览。
- 调用
-
设置远端视图。
视频通话中,如果需要看到其他用户,需要手动为其设置远端用户视图。
-
远端用户成功加入频道后,SDK 会触发
onUserJoined
回调,其中包含此用户的 uid。 -
在监听到远端用户加入房间或发布视频流后,本方可以通过
setupRemoteVideoCanvas
方法设置远端用户视频画布。 -
远端用户发布视频流后,SDK 会触发
onUserVideoStart
回调,回调中携带对方的 uid 与发布的视频分辨率。 -
调用
subscribeRemoteVideoStream
方法订阅此远端用户发起的视频流,将对方的视频流渲染到视频画布上。
// 加入房间 NERtcEx.getInstance().joinChannel(token,channelName,uid); // 开启本地视频采集并发送 NERtcEx.getInstance().enableLocalVideo(true); // 设置本地预览画布 NERtcVideoView localView = (NERtcVideoView)findViewById(R.id.local_view); NERtcEx.getInstance().setupLocalVideoCanvas(localView); // 监听远端用户进入频道 void onUserJoined(long uid); //设置远端用户视频画布 public abstract int setupRemoteVideoCanvas(com.netease.lava.api.IVideoRender render, long uid); // 监听远端用户视频流发布 void onUserVideoStart(long uid, int maxProfile); // 阅此远端用户的视频流 public abstract int subscribeRemoteVideoStream(long uid, NERtcRemoteVideoStreamType streamType, boolean subscribe);
-
3 (可选)附加功能
-
通话中质量监测
NERTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。多人视频通话 Demo 中支持实时查看当前上下行网络状态、通话质量等信息。具体请参见通话前网络质量探测、通话中质量监测。
您可以关注
onRtcStats
和onNetworkQuality
回调,并在应用层向用户展示本地通话质量等统计信息。 -
摄像头切换
ERTC SDK 支持多种视频设备管理方法,包括前后置摄像头切换、闪光灯、焦点设置等。多人视频通话移动端 Demo 支持在通话中切换前后置摄像头,您也可以参考 Demo 实现相同的效果。
调用
switchCamera
进行前置摄像头和后置摄像头的切换,通话过程中也可随时切换。 -
第三方美颜
NERTC SDK 提供了采集数据回调的 API 方法,帮助您轻松接入第三方专业美颜滤镜厂商,以完善业务场景。NERTC SDK 提供
setVideoCallback
接口用于设置相机采集数据的回调,APP 在美颜后将数据通过 NERtcVideoCallback 返回给 SDK,SDK 对美颜后的数据进行预览以及编码发送。相芯美颜的实现方法请参见相芯美颜。
4 结束视频通话
-
退出房间。
根据场景需要,如结束通话、关闭 App 或 App 切换至后台时,调用
leaveChannel
离开当前视频通话房间。离开房间成功后,SDK 会触发
onLeaveChannel
回调。 -
销毁实例。
当确定 App 短期内不再使用音视频通话实例时,可以通过
release
接口释放对应的对象资源。// 退出通话房间 NERtcEx.getInstance().leaveChannel(); // 销毁实例 NERtcEx.getInstance().release();