集成 RTC SDK 后,你可以使用其中接口快速构建基础应用,实现基本实时音视频通话;你也能通过阅读代码,了解音视频通话的最佳实践。

如果你想了解完整的项目实现,参看快速开始 Demo。

前提条件
集成 SDK
步骤1:(可选)创建项目

本步骤为如何创建一个新项目,如集成到已有项目,请直接查看步骤 2。

  1. 打开 Visual Studio 2017,选择“文件 > 新建 > 项目”菜单

image.png

  1. 在新建项目窗口,选择项目类型为“MFC 应用程序”,输入项目名称,选择项目存储路径,并单击“确定”。

image.png

步骤2: 解压 SDK,并拷贝到项目目录下

根据你的开发需求选择下载Win32 或 x64平台SDK, 并将下载后对应平台下“VolcEngineRTC”文件夹复制到你的项目文件夹下。

步骤3:配置项目属性

在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置完成后点击确定。

  1. 将 “include” 目录加入到头文件搜索路径。

进入 配置属性> C/C++ > 常规 > 附加包含目录,点击编辑,添加“include” 目录。

image.png

  1. 将 “lib” 目录加入到库搜索路径。

进入“配置属性 > 链接器 > 常规”,在“附加库目录”中添加 “VolcEngineRTC/lib/Win32” 或 “VolcEngineRTC\lib\x64” 目录。

image.png

  1. 指定链接库

  2. 进入“配置属性 > 链接器 > 输入”菜单,在“附加依赖项”中添加 “VolcEngineRTC.lib”。

image.png

实现音视频通话
基础音视频通话 API 时序图

alt

实现流程
1. (可选)创建用户界面

根据场景需要,为你的项目创建音视频通话的用户界面。若已有用户界面,请跳过此步骤。

如果你想实现基本的音视频通话,我们建议你在项目中添加如下元素:

image.png

2. 引入头文件

在用到 SDK API 的文件中引入头文件。

#include "bytertc_video.h"
#include "bytertc_room.h"
#include "bytertc_video_event_handler.h"
#include "bytertc_room_event_handler.h"
cpp
3. 创建引擎 createRTCVideo
BYTERTC_API bytertc::IRTCVideo* createRTCVideo(const char* app_id,
        bytertc::IRTCVideoEventHandler *event_handler, const char* parameters);
cpp

首先你需要调用类 IRTCVideo 中的 createRTCVideo 接口,创建一个引擎实例,以使用 RTC 提供的各种音视频能力。

你需要在该方法中传入以下参数:

参数名类型说明
app_idconst char*每个应用的唯一标识符。只有使用相同的 app_id 生成的实例,才能够进行音视频通信。
event_handlerbytertc::IRTCVideoEventHandler*SDK 回调给应用层的 Callback 对象,详见 IRTCVideoEventHandler 。
parametersconst char*用以覆盖默认参数的本引擎实例参数。JSON 字符串格式。
4. 设置视频编码参数 setVideoEncoderConfig
virtual int setVideoEncoderConfig(const VideoEncoderConfig& max_solution) = 0;
cpp

创建引擎实例后,你可以设置视频编码参数修改推送的视频流属性。

你需要在该方法中传入以下参数:

参数名类型说明
max_solutionconst VideoEncoderConfig&期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig。
5. 设置本地视图 setLocalVideoCanvas
virtual int setLocalVideoCanvas(StreamIndex index, const VideoCanvas& canvas) = 0;
cpp

加入房间前,你需要设置本地视图以在通话中看到本地图像。

你需要在该方法中传入以下参数:

参数名类型说明
indexStreamIndex视频流属性, 参看 StreamIndex
canvasconst VideoCanvas&视图信息和渲染模式,参看:VideoCanvas
6. 开始视频采集 startVideoCapture
virtual void startVideoCapture() = 0;
cpp

创建引擎实例后,你需要开启视频采集,以在通话中使用视频功能。

7. 开始音频采集 startAudioCapture
virtual void startAudioCapture() = 0;
cpp

创建引擎实例后,你需要开启音频采集,以在通话中使用音频功能。

8. 创建房间实例 createRTCRoom
virtual IRTCRoom* createRTCRoom(const char* room_id) = 0;
cpp

创建一个房间实例,以使用房间相关的功能。

roomId 应符合正则表达式:[a-zA-Z0-9_@\-]{1,128}。

9. 设置房间回调事件 handler setRTCRoomEventHandler
virtual void setRTCRoomEventHandler(IRTCRoomEventHandler* room_event_handler) = 0;
cpp

你需要在该方法中传入以下参数:

参数名类型说明
room_event_handlerIRTCRoomEventHandler*参见 IRTCRoomEventHandler
10. 加入房间 joinRoom
virtual int joinRoom(const char* token, const UserInfo& user_info, const RTCRoomConfig& config) = 0;
cpp

创建房间实例后,你就可以调用 IRTCRoom 类中的 joinRoom 方法创建/加入房间。

你需要在该方法中传入以下参数:

参数名类型说明

token

const char*

动态密钥,用于对登录用户进行鉴权验证。
进入房间需要携带 Token。测试时可使用控制台生成临时 Token,正式上线需要使用密钥 SDK 在您的服务端生成并下发 Token。
• 使用不同 App ID 的 App 是不能互通的。
• 请务必保证生成 Token 使用的 App ID 和创建引擎时使用的 App ID 相同,否则会导致加入房间失败。

user_infoconst UserInfo&用户信息,参看 UserInfo。
room_configconst RTCRoomConfig& config房间参数配置,设置房间模式以及是否自动发布或订阅流。具体配置模式参看 RTCRoomConfig。
11. 处理房间状态改变回调 onRoomStateChanged
virtual void onRoomStateChanged(
            const char* room_id, const char* uid, int state, const char* extra_info)
cpp

加入房间后,你需要在此回调中处理首次加入房间/重连加入房间的事件。

回调参数说明:

参数名类型说明
room_idconst char*房间 ID。
uidconst char*用户 ID。

state

int

房间状态码。
• 0: 成功。
• !0: 失败,具体原因参看 ErrorCode 及 WarningCode。

extra_info

const char*

额外信息,如 {"elapsed":1187,"join_type":0}。
join_type 表示加入房间的类型,0为首次进房,1为重连进房。
elapsed 表示加入房间耗时,即本地用户从调用 joinRoom 到加入房间成功所经历的时间间隔,单位为 ms。

12. 处理远端用户加入房间的回调 onUserJoined
virtual void onUserJoined(const UserInfo& user_info, int elapsed)
cpp

加入房间后,你需要在此回调中处理远端用户加入房间的事件。

回调参数说明:

参数名类型说明
user_infoconst UserInfo&用户信息,详见 UserInfo
elapsedint此参数无意义
13. 处理远端视频首帧解码的回调 onFirstRemoteVideoFrameDecoded
virtual void onFirstRemoteVideoFrameDecoded(const RemoteStreamKey key, const VideoFrameInfo& info)
cpp

加入房间后,你需要在此回调中处理第一帧远端视频流解码成功后的事件。

回调参数说明:

参数名类型说明
keyconst RemoteStreamKey远端流信息。参看 RemoteStreamKey。
infoconst VideoFrameInfo&视频帧信息。参看 VideoFrameInfo。
14. 设置远端视图 setRemoteStreamVideoCanvas
virtual void setRemoteStreamVideoCanvas(RemoteStreamKey stream_key, const VideoCanvas& canvas) = 0;
cpp

在确认收到远端用户的第一帧视频解码回调后,你需要设置远端视图以在通话中查看远端图像。

你需要在该方法中传入以下参数:

参数名类型说明
stream_keyRemoteStreamKey远端流信息。参看 RemoteStreamKey
canvasconst VideoCanvas&视图信息和渲染模式。参看:VideoCanvas
15. 处理远端用户离开房间的回调 onUserLeave
virtual void onUserLeave(const char* uid, UserOfflineReason reason)
cpp

加入房间后,你需要在此回调中处理远端用户离开房间的事件。

回调参数说明:

参数名类型说明
uidconst char*离开房间,或切至不可见的的远端用户 ID。

reason

UserOfflineReason

用户离开房间的原因:
• 0: 远端用户调用 leaveRoom 主动退出房间。
• 1: 远端用户因 Token 过期或网络原因等掉线。
• 2: 远端用户调用 setUserVisibility 切换至不可见状态。
• 3: 服务端调用 OpenAPI 将远端用户踢出房间。

16. 离开房间 leaveRoom
virtual void leaveRoom() = 0;
cpp

在结束通话等场景下,你需要调用 leaveRoom 离开房间,结束通话过程,释放所有通话相关的资源。

17. 销毁引擎实例 destroyRTCVideo
BYTERTC_API void destroyRTCVideo();
cpp

在 RTC 引擎实例相关的业务场景全部结束后,你可调用 destroyRTCVideo 销毁由 createRTCVideo 所创建引擎实例,并释放所有相关资源。

至此,我们实现了基本的音视频通话。