实现音视频通话(macOS)
网易云信音视频通话产品的基本功能包括高质量的实时音视频通话。当您成功初始化 SDK 之后,您可以简单体验本产品的基本业务流程。本文档为您展示音视频通话提供的基本业务流程。
前提条件
请确认您已完成以下操作:
快速跑通 Sample Code
注意:在运行示例项目之前,请联系商务经理开通非安全模式。非安全模式建议只在集成开发阶段使用,请在应用正式上线前改回安全模式。
在SDK和示例代码下载页面或 Demo 体验页面下载需要体验的示例项目或 Demo 源码工程。
在源码工程所在文件夹下新建文件夹
nertc_sdk_mac
。在 SDK 下载中心获取最新版本的 NERTC SDK,将解压后的文件
NEFundation_Mac.framework
、nertc_sdk_Mac.framework
拷贝到文件夹nertc_sdk_mac
下。开启一个终端,执行以下命令生成 Xcode 工程。
qmake -spec macx-xcode NERtcSample-1to1-Windows_Mac.pro
- 使用 Xcode 打开工程,在 Build Phases 选项中单击 Copy Files Phase。
在 Copy Files 页面中将 Destination 设置为 Frameworks,并添加
NEFundation_Mac.framework
与nertc_sdk_Mac.framework
。在
nrtc_engine.h
中配置 Appkey。#define APP_KEY "" // put your app key here, testing
- 使用 Xcode 打开上述建立好的工程,在
Info.plist
中添加访问摄像头及麦克风设备的权限,单机运行即可运行程序。
实现音视频通话
本节主要介绍如何使用 NERTC SDK 实现音视频通话,主要流程如下图所示:
1. 引用头文件
在您的工程中对应的文件里添加如下代码引入头文件:
#include "nrtc_engine.h"
2. 初始化
在操作 SDK 接口前,需要完成初始化。
- 调用 createNERtcEngine 方法创建一个 NERtcEngine 实例。
- 调用 initialize 方法完成初始化。
// 创建 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 = this;
// 初始化 NERTC SDK 服务。
if (kNERtcNoError != rtc_engine_->initialize(rtc_engine_context_))
{
//TODO
}
3. 设置本地视图
初始化成功后,可以设置设置本地视图,来预览本地图像。您可以在加入房间之前预览,或在加入房间后预览。
加入房间前预览。
通过 setupLocalVideoCanvas 与 startVideoPreview 方法,在加入房间前设置本地视图,预览本地图像。
// 示例 NERtcVideoCanvas canvas; canvas.cb = nullptr; canvas.user_data = nullptr; canvas.window = window; // 设置视频缩放模式。 canvas.scaling_mode = mode; // 设置本地视频画布 rtc_engine_->setupLocalVideoCanvas(&canvas); // 开启本地预览 rtc_engine_->startVideoPreview();
若要结束预览,或者准备加入房间时,调用 stopVideoPreview 停止预览。
加入房间后预览。
在成功加入房间后,通过 enableLocalVideo 方法进行视频的采集发送与预览。
```cpp // 示例 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); ```
4. 加入房间
加入房间前,请确保已完成初始化相关事项。若您的业务中涉及呼叫邀请等机制,建议通过信令实现。
通过 joinChannel 方法加入房间。
// 示例
rtc_engine_->joinChannel(token, channel_name, uid);
参数说明:
参数 | 说明 |
---|---|
token | 安全认证签名 Token。可设置为:
|
channel_name | 房间名称,设置相同房间名称的用户会进入同一个通话房间。 注意:您也可以在加入通道前,通过创建房间接口创建房间。若通过 joinChannel 接口加入房间时,传入的 {channel_name} 未事先创建,则云信服务器内部将为其自动创建一个名为 {channel_name} 的通话房间。 |
uid | 用户的唯一标识 id,房间内每个用户的 uid 必须是唯一的。 |
SDK发起加入房间请求后,服务器会进行响应,开发者可以通过初始化时设置的rtc_engine_context_.event_handler的onJoinChannel回调监听加入房间的结果,同时该回调会抛出当前通话房间的 channelId 与加入房间总耗时(毫秒)。
5. 设置远端视图
音视频通话过程中,除了要显示本地的视频画面,通常也要显示参与互动的其他连麦者/主播的远端视频画面。
IRtcEngineEventHandler 通过以下回调获取相关信息:
onUserJoined:监听远端用户加入通话房间的事件,并抛出对方的 uid。当本端加入房间后,也会通过此回调抛出通话房间内已有的其他用户。
onUserVideoStart :监听远端用户发布视频流的事件,回调中携带对方的 uid 与发布的视频分辨率。
在监听到远端用户加入房间或发布视频流后,本方可以通过 – setupRemoteVideoCanvas:forUserID: 方法设置远端用户视频画布,用于显示其视频画面。
// 示例 NERtcVideoCanvas canvas; canvas.cb = nullptr; canvas.user_data = nullptr; canvas.window = window; // 设置视频缩放模式。 canvas.scaling_mode = mode; rtc_engine_->setupRemoteVideoCanvas(uid, &canvas);
在监听到远端用户发布视频流后,本方可以通过 subscribeRemoteVideoStream 方法对其发起视频流的订阅,来将对方的视频流渲染到视频画布上。
// 示例 // 订阅指定用户的 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); } }
监听远端用户离开房间或关闭视频功能。
- onUserLeft:用户离开房间回调。
- onUserVideoStop:远端用户关闭视频功能回调。
6. 音频流
在 NERTC SDK 中,本地音频的采集发布和远端音频订阅播放是默认启动的,正常情况下无需开发者主动干预。
7. 退出通话房间
通过 leaveChannel 接口退出通话房间。
// 示例
rtc_engine_->leaveChannel();
真正退出房间后,SDK 会走入初始化时设置的 rtc_engine_context_.event_handler 回调事件通知中的 onLeaveChannel。
8. 销毁实例
当确定短期内不再使用音视频通话实例时,可以释放对应的对象资源。
// 示例
// 同步销毁 IRtcEngine 对象
rtc_engine_->release(true);
// 销毁 RTC 引擎对象
destroyNERtcEngine((void*&)rtc_engine_);
rtc_engine_ = nullptr;


此文档对你是否有帮助

