前提条件
- Microsoft Visual Studio 2019 或以上版本
- 反对 Windows 7 或以上版本的 Windows 设施
- 无效的 Agora 账户(收费注册)
注:如果你的网络环境部署了防火墙,请依据声网文档核心的「利用企业防火墙限度」关上相干端口。
设置开发环境
本节介绍如何创立我的项目,并将 Agora SDK 集成至你的我的项目中。
创立 Windows 我的项目
参考以下步骤创立一个 Windows 我的项目。若已有 Windows 我的项目,间接查看集成 SDK。
创立 新的 MFC 我的项目
1. 关上 Microsoft Visual Studio 并点击新建我的项目。
2. 进入新建我的项目窗口,抉择我的项目类型为 MFC 应用程序,输出项目名称,抉择我的项目存储门路,并点击确认。
3. 进入 MFC 应用程序窗口,抉择应用程序类型为基于对话框,并点击实现。
初学者间接下载文中前面的 github 地址我的项目
集成 SDK
参考以下步骤将 Agora SDK 集成到你的我的项目中。
1. 配置我的项目文件
- 依据利用场景,从 官网获取最新 SDK,解压并关上。
- 将下载包中的 sdk 文件夹复制到你的我的项目文件夹下。
- 目前 3.6.2 版本,目录构造为 libs/include,libs/x86,libs/x86_64
2. 配置我的项目属性
在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置实现后点击确定。
- 进入 C/C++ > 惯例 > 附加蕴含目录菜单,点击编辑,并在弹出窗口抉择解压的 libs/include。
- 进入链接器 > 惯例 > 附加库目录菜单,点击编辑,并在弹出窗口中解压的 libs/x86 或 libs/x86_64。
- 进入链接器 > 输出 > 附加依赖项菜单,点击编辑,并在弹出窗口中解压的 agora_rtc_sdk.lib。
实现音视频通话
本节介绍如何实现音视频通话。视频通话 的 API 调用时序见下图:
1. 创立用户界面
依据场景须要,为你的我的项目创立音视频通话的用户界面。若已有用户界面,能够间接初始化 IRtcEngine。
如果你想实现一个视频通话,咱们举荐你增加如下 UI 元素:
- 本地视频窗口
- 远端视频窗口
- 完结通话按钮
当你应用本文链接中,GitHub 我的项目中的界面时,你将会看到如下界面:
2. 初始化 IRtcEngine
在调用其余 Agora API 前,须要创立并初始化 IRtcEngine 对象。
你须要在该步骤中填入我的项目的 App ID。请参考如下步骤在控制台(console.agora.io)创立 Agora 我的项目并获取 App ID:
1. 登录控制台,点击左侧导航栏的项目管理图标 。
2. 点击创立,依照屏幕提示设置我的项目名,抉择一种鉴权机制,而后点击提交。
3. 在项目管理页面,你能够获取该项目标 App ID。
调用 createAgoraRtcEngine
和 initialize
办法,传入获取到的 App ID,即可初始化 IRtcEngine
。
你还能够依据场景须要,在初始化时注册想要监听的回调事件,如本地用户退出频道,及解码远端用户视频首帧等。
/**
create or return existing AgoraObject
*/
CAgoraObject *CAgoraObject::GetAgoraObject(LPCTSTR lpAppId)
{if (m_lpAgoraObject == NULL)
m_lpAgoraObject = new CAgoraObject();
if (m_lpAgoraEngine == NULL)
m_lpAgoraEngine = (IRtcEngine *)createAgoraRtcEngine();
if (lpAppId == NULL)
return m_lpAgoraObject;
RtcEngineContext ctx;
ctx.eventHandler = &m_EngineEventHandler;
#ifdef UNICODE
char szAppId[128];
::WideCharToMultiByte(CP_ACP, 0, lpAppId, -1, szAppId, 128, NULL, NULL);
ctx.appId = szAppId;
#else
ctx.appId = lpAppId;
#endif
m_lpAgoraEngine->initialize(ctx);
return m_lpAgoraObject;
}
// 继承 IRtcEngineEventHandler 类中的回调与事件。class CAGEngineEventHandler :
public IRtcEngineEventHandler
{
public:
CAGEngineEventHandler(void);
~CAGEngineEventHandler(void);
void SetMsgReceiver(HWND hWnd = NULL);
HWND GetMsgReceiver() {return m_hMainWnd;};
// 本地用户胜利退出频道时,会触发该回调。virtual void onJoinChannelSuccess(const char* channel, uid_t uid, int elapsed);
// 本地重新加入频道时,会触发该回调。virtual void onRejoinChannelSuccess(const char* channel, uid_t uid, int elapsed);
virtual void onWarning(int warn, const char* msg);
virtual void onError(int err, const char* msg);
virtual void onAudioQuality(uid_t uid, int quality, unsigned short delay, unsigned short lost);
virtual void onAudioVolumeIndication(const AudioVolumeInfo* speakers, unsigned int speakerNumber, int totalVolume);
// 本地用户胜利来到频道时,会触发该回调。virtual void onLeaveChannel(const RtcStats& stat);
// 以下还有多个扩大办法
/*
....
/*
private:
HWND m_hMainWnd;
};
3. 设置本地视图
如果你想实现一个语音通话,能够间接跳过这一步,查看下一步「退出频道」。
胜利初始化 IRtcEngine 对象后,须要在退出频道前设置本地视图,以便在通话中看到本地图像。默认关上本地摄像头,参考以下步骤设置本地视图:
- 调用
enableVideo
办法启用视频模块。 - 调用
setupLocalVideo
办法设置本地视图。
// 启用视频模块。m_lpAgoraObject->GetEngine()->enableVideo();// 设置本地视图。// 在文件 AgoraTutorialDlg.cpp 中
BOOL CAgoraTutorialDlg::OnInitDialog(){
VideoCanvas vc;
vc.uid = 0;
vc.view = m_wndLocal.GetSafeHwnd();
vc.renderMode = RENDER_MODE_FIT;
m_lpAgoraObject->GetEngine()->setupLocalVideo(vc);
//...
}
4. 退出频道
实现初始化和设置本地视图后(视频通话场景),你就能够调用 joinChannel
办法退出频道。你须要在该办法中传入如下参数:
channelName
: 传入能标识频道的频道 ID。输出频道 ID 雷同的用户会进入同一个频道。- token:传入能标识用户角色和权限的 Token。可设为如下一个值:
注:若我的项目已启用 App 证书,请应用 Token。
NULL
- 长期 Token。长期 Token 服务有效期为 24 小时。你能够在控制台里生成一个长期 Token,详情请在文档核心搜寻「获取长期 Token」。
- 在你的服务器端生成的 Token。在平安要求高的场景下,咱们举荐你应用此种形式生成的 Token。
uid
: 本地用户的 ID。数据类型为整型,且频道内每个用户的uid
必须是惟一的。若将uid
设为 0,则 SDK 会主动调配一个uid
,并在onJoinChannelSuccess
回调中报告。
更多的参数设置注意事项请参考声网文档核心 joinChannel
接口中的参数形容。
// 退出频道。在文件 "AgoraObject.cpp" 中
BOOL CAgoraObject::JoinChannel(LPCTSTR lpChannelName, UINT nUID,LPCTSTR lpToken)
{
int nRet = 0;
#ifdef UNICODE
CHAR szChannelName[128];
::WideCharToMultiByte(CP_UTF8, 0, lpChannelName, -1, szChannelName, 128, NULL, NULL);
char szToken[128];
::WideCharToMultiByte(CP_UTF8, 0, lpToken, -1, szToken, 128, NULL, NULL);
if(0 == _tcslen(lpToken))
nRet = m_lpAgoraEngine->joinChannel(NULL, szChannelName, NULL, nUID);
else
nRet = m_lpAgoraEngine->joinChannel(szToken, szChannelName, NULL, nUID);
#else
if(0 == _tcslen(lpToken))
nRet = m_lpAgoraEngine->joinChannel(NULL, lpChannelName, NULL, nUID);
else
nRet = m_lpAgoraEngine->joinChannel(lpToken, lpChannelName, NULL, nUID);
#endif
if (nRet == 0)
m_strChannelName = lpChannelName;
return nRet == 0 ? TRUE : FALSE;
}
5. 设置远端视图
视频通话中,通常你也须要看到其余用户。在退出频道后,可通过调用 setupRemoteVideo
办法设置远端用户的视图。
远端用户胜利退出频道后,SDK 会触发 onFirstRemoteVideoDecoded
回调,该回调中会蕴含这个远端用户的 uid
信息。在该回调中调用 setupRemoteVideo
办法,传入获取到的 uid
,设置远端用户的视图。
// SDK 接管到第一帧远端视频并胜利解码时,会触发该回调。// 在该回调中调用 setupRemoteVideo 办法设置远端视图。存在于文件“AgoraTutorialDlg.cpp”中
LRESULT CAgoraTutorialDlg::OnFirstRemoteVideoDecoded(WPARAM wParam, LPARAM lParam)
{LPAGE_FIRST_REMOTE_VIDEO_DECODED lpData = (LPAGE_FIRST_REMOTE_VIDEO_DECODED)wParam;
VideoCanvas vc;
vc.renderMode = RENDER_MODE_FIT;
vc.uid = lpData->uid;
vc.view = m_wndRemote.GetSafeHwnd();
m_lpAgoraObject->GetEngine()->setupRemoteVideo(vc);// 设置远端视图
delete lpData;
return 0;
}
6. 来到频道
依据场景须要,如完结通话、敞开 App 或 App 切换至后盾时,调用 leaveChannel
来到以后通话频道。
/**
Leave the channel
*/
BOOL CAgoraObject::LeaveChannel()
{m_lpAgoraEngine->stopPreview();
int nRet = m_lpAgoraEngine->leaveChannel();
return nRet == 0 ? TRUE : FALSE;
}
示例代码
你能够在 Agora-Windows-Tutorial-1to1 示例我的项目的 AgoraTutorialDlg.cpp 文件中查看残缺的源码和代码逻辑。