客户端实现
更新时间: 2024/08/02 11:26:48
网易云信音视频通话 2.0 产品为您提供开源的的多人视频通话示例项目,您可以参考示例项目和本文档快速实现多人视频通话的主要流程步骤,体验 NERTC SDK 的多人音视频通话的效果。
前提条件
请确保您已完成以下操作:
- 已创建应用并获取 App Key。
- 已开通音视频通话 2.0 服务。
- 集成 NERTC SDK。
- 在云信控制台中为指定应用开通调试模式。
注意事项
集成开发阶段,建议在控制台中将指定应用的鉴权方式设置为调试模式,此时无需传入 Token 即可加入房间。但是出于安全性考虑,应用正式上线前,请在控制台中将指定应用的鉴权方式改回安全模式。
API 时序图
实现多人视频通话
1 初始化 SDK
在操作 SDK 接口前,需要完成初始化。
-
调用
createNERtcEngine
方法创建一个 NERtcEngine 实例。 -
调用
initialize
方法完成初始化。 -
设置音视频参数和属性。
您可以根据不同场景下的用户喜好与需求,设置音视频的基本属性。音频可设置采样率、码率和编码模式等,视频可设置分辨率、帧率、码率的档位,裁剪模式等参数。
调用setChannelProfile设置房间的场景属性,具体请参见音视频参数配置推荐。
示例代码如下:
cpp// 创建 RTC 引擎对象并返回指针。
nertc::IRtcEngineEx *rtc_engine_ = (IRtcEngineEx *)createNERtcEngine();
// 设置已开通音视频功能的云信应用的AppKey。
rtc_engine_context_.app_key = app_key_.c_str();
// 设置日志目录的完整路径,采用UTF-8 编码。可选。
rtc_engine_context_.log_dir_path = log_dir_path_.c_str();
// 设置日志级别,默认级别为 kNERtcLogLevelInfo。
rtc_engine_context_.log_level = log_level;
// 指定 SDK 输出日志文件的大小上限,单位为 KB。如果设置为 0,则默认为 20 M。
rtc_engine_context_.log_file_max_size_KBytes = log_file_max_size_KBytes;
// 设置SDK向应用发送回调事件的通知。
rtc_engine_context_.event_handler = event_hander_;
// 初始化 NERTC SDK 服务。
if (kNERtcNoError != rtc_engine_->initialize(rtc_engine_context_))
{
//获取音频设备管理指针
rtc_engine_->queryInterface(nertc::kNERtcIIDAudioDeviceManager, (void **)&_adm);
//获取视频谁管理指针
rtc_engine_->queryInterface(nertc::kNERtcIIDVideoDeviceManager, (void **)&_vdm);
//设置房间场景
rtc_engine_->setChannelProfile(nertc::kNERtcChannelProfileCommunication);
//设置用户角色
rtc_engine_->setClientRole(nertc::kNERtcClientRoleBroadcaster);
}
2 开始视频通话
-
设置本地视图。
- 调用
setupLocalVideoCanvas
方法设置本地视图。 - 调用
enableLocalVideo
方法进行视频的采集发送与预览。
- 调用
-
加入房间。
完成初始化后,调用
joinChannel
方法加入房间。SDK发起加入房间请求后,服务器会进行响应,开发者可以通过onNERtcEngineUserDidJoinWithUserID:userName
回调监听加入房间的结果。您也可以通过信令实现通话中的邀请机制。
-
设置远端视图。
视频通话中,如果需要看到其他用户,需要手动为其设置远端用户视图。
-
监听远端用户成功加入(
onUserJoined
)和远端用户发布视频流(onUserVideoStart
)的回调。 -
在监听到远端用户加入房间或发布视频流后,本方可以通过
setupRemoteVideoCanvas
方法设置远端用户视频画布。 -
订阅远端视频流。
在设置完远端视频画布后,且监听到远端用户发布视频流时,本端可以调用
subscribeRemoteVideoStream
方法对其发起视频流的订阅,来将对方的视频流渲染到视频画布上。
-
示例代码如下:
// 加入房间
rtc_engine_->joinChannel(token, channel_name, uid);
// 开启本地视频采集并发送
// 示例
NERtcVideoCanvas canvas;
canvas.cb = nullptr;
canvas.user_data = nullptr;
canvas.window = window;
// 设置视频缩放模式。
canvas.scaling_mode = mode;
// 设置本地视频画布
rtc_engine_->setupLocalVideoCanvas(&canvas);
bool enabled = true;
// 启动视频流
rtc_engine_->enableLocalVideo(enabled);
// 设置远端视图
// 示例
NERtcVideoCanvas canvas;
canvas.cb = nullptr;
canvas.user_data = nullptr;
canvas.window = window;
// 设置视频缩放模式。
canvas.scaling_mode = mode;
rtc_engine_->setupRemoteVideoCanvas(uid, &canvas);
// 订阅指定用户的 kNERtcRemoteVideoStreamTypeHigh 类型的视频流
void NRTCEngine::subscribeRemoteUserVideoStream(nertc::uid_t uid) {
int ret_temp = rtc_engine_->subscribeRemoteVideoStream(uid, kNERtcRemoteVideoStreamTypeHigh, true);
if (ret_temp) {
qDebug("[ERROR] can not subscribe remote video stream! ERROR CODE: %d", ret_temp);
}
}
3 (可选)进阶功能
-
通话中质量监测
NERTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。多人视频通话 Demo 中支持实时查看当前上下行网络状态、通话质量等信息。具体实现方法请参见通话前网络质量探测、通话中质量监测。
您可以关注
onRtcStats
等回调,并在应用层向用户展示本地通话质量等统计信息。 -
第三方美颜
NERTC SDK 提供了采集数据回调的 API 方法,帮助您轻松接入第三方专业美颜滤镜厂商,以完善业务场景,具体请参见相芯美颜。
在代理方法
onCaptureVideoFrame
中,将原始视频图像数据通过回调发给相芯美颜的接口,做相应的美颜处理,并对回调回来的视频数据做相应的处理。
4 结束视频通话
-
退出房间。
根据场景需要,如结束通话、关闭 App 或 App 切换至后台时,调用
leaveChannel
离开当前视频通话房间。 -
销毁实例。
当确定 App 短期内不再使用音视频通话实例时,可以通过
release
和destroyNERtcEngine
方法释放对应的对象资源。
示例代码如下:
// 退出通话房间
rtc_engine_->leaveChannel();
// 销毁实例
//一般情况下无需使用,当确定短期内不再使用音视频通话实例时,可以释放对应的对象资源。
// 示例
// 同步销毁 IRtcEngine 对象
rtc_engine_->release(true);
// 销毁 RTC 引擎对象
destroyNERtcEngine((void*&)rtc_engine_);
rtc_engine_ = nullptr;