集成 RTC SDK 后,你可以使用其中接口快速构建基础应用,实现基本实时音视频通话;你也能通过阅读代码,了解音视频通话的最佳实践。
如果你想了解完整的项目实现,参看快速开始 Demo。
本步骤为如何创建一个新项目,如集成到已有项目,请直接查看步骤 2。
根据你的开发需求选择下载Win32 或 x64平台SDK, 并将下载后对应平台下“VolcEngineRTC”文件夹复制到你的项目文件夹下。
在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置完成后点击确定。
进入 配置属性> C/C++ > 常规 > 附加包含目录,点击编辑,添加“include” 目录。
进入“配置属性 > 链接器 > 常规”,在“附加库目录”中添加 “VolcEngineRTC/lib/Win32” 或 “VolcEngineRTC\lib\x64” 目录。
指定链接库
进入“配置属性 > 链接器 > 输入”菜单,在“附加依赖项”中添加 “VolcEngineRTC.lib”。

根据场景需要,为你的项目创建音视频通话的用户界面。若已有用户界面,请跳过此步骤。
如果你想实现基本的音视频通话,我们建议你在项目中添加如下元素:
房间ID
用户 ID
本地视频窗口
远端视频窗口
打开麦克风按钮
打开摄像头按钮
结束通话按钮
在用到 SDK API 的文件中引入头文件。
#include "bytertc_video.h"
#include "bytertc_room.h"
#include "bytertc_video_event_handler.h"
#include "bytertc_room_event_handler.h"
cppBYTERTC_API bytertc::IRTCVideo* createRTCVideo(const char* app_id,
bytertc::IRTCVideoEventHandler *event_handler, const char* parameters);
cpp首先你需要调用类 IRTCVideo 中的 createRTCVideo 接口,创建一个引擎实例,以使用 RTC 提供的各种音视频能力。
你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| app_id | const char* | 每个应用的唯一标识符。只有使用相同的 app_id 生成的实例,才能够进行音视频通信。 |
| event_handler | bytertc::IRTCVideoEventHandler* | SDK 回调给应用层的 Callback 对象,详见 IRTCVideoEventHandler 。 |
| parameters | const char* | 用以覆盖默认参数的本引擎实例参数。JSON 字符串格式。 |
virtual int setVideoEncoderConfig(const VideoEncoderConfig& max_solution) = 0;
cpp创建引擎实例后,你可以设置视频编码参数修改推送的视频流属性。
你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| max_solution | const VideoEncoderConfig& | 期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig。 |
virtual int setLocalVideoCanvas(StreamIndex index, const VideoCanvas& canvas) = 0;
cpp加入房间前,你需要设置本地视图以在通话中看到本地图像。
你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| index | StreamIndex | 视频流属性, 参看 StreamIndex |
| canvas | const VideoCanvas& | 视图信息和渲染模式,参看:VideoCanvas |
virtual void startVideoCapture() = 0;
cpp创建引擎实例后,你需要开启视频采集,以在通话中使用视频功能。
virtual void startAudioCapture() = 0;
cpp创建引擎实例后,你需要开启音频采集,以在通话中使用音频功能。
virtual IRTCRoom* createRTCRoom(const char* room_id) = 0;
cpp创建一个房间实例,以使用房间相关的功能。
roomId 应符合正则表达式:[a-zA-Z0-9_@\-]{1,128}。
virtual void setRTCRoomEventHandler(IRTCRoomEventHandler* room_event_handler) = 0;
cpp你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| room_event_handler | IRTCRoomEventHandler* | 参见 IRTCRoomEventHandler |
virtual int joinRoom(const char* token, const UserInfo& user_info, const RTCRoomConfig& config) = 0;
cpp创建房间实例后,你就可以调用 IRTCRoom 类中的 joinRoom 方法创建/加入房间。
你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
token | const char* | 动态密钥,用于对登录用户进行鉴权验证。 |
| user_info | const UserInfo& | 用户信息,参看 UserInfo。 |
| room_config | const RTCRoomConfig& config | 房间参数配置,设置房间模式以及是否自动发布或订阅流。具体配置模式参看 RTCRoomConfig。 |
virtual void onRoomStateChanged(
const char* room_id, const char* uid, int state, const char* extra_info)
cpp加入房间后,你需要在此回调中处理首次加入房间/重连加入房间的事件。
回调参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| room_id | const char* | 房间 ID。 |
| uid | const char* | 用户 ID。 |
state | int | 房间状态码。 |
extra_info | const char* | 额外信息,如 |
virtual void onUserJoined(const UserInfo& user_info, int elapsed)
cpp加入房间后,你需要在此回调中处理远端用户加入房间的事件。
回调参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| user_info | const UserInfo& | 用户信息,详见 UserInfo |
| elapsed | int | 此参数无意义 |
virtual void onFirstRemoteVideoFrameDecoded(const RemoteStreamKey key, const VideoFrameInfo& info)
cpp加入房间后,你需要在此回调中处理第一帧远端视频流解码成功后的事件。
回调参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| key | const RemoteStreamKey | 远端流信息。参看 RemoteStreamKey。 |
| info | const VideoFrameInfo& | 视频帧信息。参看 VideoFrameInfo。 |
virtual void setRemoteStreamVideoCanvas(RemoteStreamKey stream_key, const VideoCanvas& canvas) = 0;
cpp在确认收到远端用户的第一帧视频解码回调后,你需要设置远端视图以在通话中查看远端图像。
你需要在该方法中传入以下参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| stream_key | RemoteStreamKey | 远端流信息。参看 RemoteStreamKey |
| canvas | const VideoCanvas& | 视图信息和渲染模式。参看:VideoCanvas |
virtual void onUserLeave(const char* uid, UserOfflineReason reason)
cpp加入房间后,你需要在此回调中处理远端用户离开房间的事件。
回调参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| uid | const char* | 离开房间,或切至不可见的的远端用户 ID。 |
reason | UserOfflineReason | 用户离开房间的原因: |
virtual void leaveRoom() = 0;
cpp在结束通话等场景下,你需要调用 leaveRoom 离开房间,结束通话过程,释放所有通话相关的资源。
BYTERTC_API void destroyRTCVideo();
cpp在 RTC 引擎实例相关的业务场景全部结束后,你可调用 destroyRTCVideo 销毁由 createRTCVideo 所创建引擎实例,并释放所有相关资源。
至此,我们实现了基本的音视频通话。