本文介绍如何通过 Agora SDK 在 Windows 平台疾速实现互动直播。互动直播和实时通话的区别就在于,直播频道的用户有角色之分。你能够将角色设置为主播或者观众,其中主播能够收、发流,观众只能收流。
Demo 体验
Agora 在 GitHub 上提供一个开源的实时音视频通话示例我的项目 OpenLive-Windows。在实现相干性能前,你能够下载并查看源代码:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-Windows-MFC
前提条件
- Microsoft Visual Studio 2017 或以上版本
- 反对 Windows 7 或以上版本的 Windows 设施
- 无效的 Agora 账户(收费注册)
如果你的网络环境部署了防火墙,请依据声网文档核心的「利用企业防火墙限度」关上相干端口。
设置开发环境
本节介绍如何创立我的项目,并将 Agora SDK 集成至你的我的项目中。
创立 Windows 我的项目
参考以下步骤创立一个 Windows 我的项目。若已有 Windows 我的项目,间接查看集成 SDK。
1. 关上 Microsoft Visual Studio 并点击新建我的项目。
2. 进入新建我的项目窗口,抉择我的项目类型为 MFC 应用程序,输出项目名称,抉择我的项目存储门路,并点击确认。
3. 进入 MFC 应用程序窗口,抉择应用程序类型为基于对话框,并点击实现。
集成 SDK
参考以下步骤将 Agora SDK 集成到你的我的项目中。
1. 配置我的项目文件
- 依据利用场景,从 SDK 下载获取最新 SDK,解压并关上。
- 关上已下载的 SDK 文件,并将其中的 sdk 文件夹 复制到你的我的项目文件夹 下。
2. 配置我的项目属性
在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置实现后点击确定。
- 进入 C/C++ > 惯例 > 附加蕴含目录菜单,点击编辑,并在弹出窗口抉择解压的 libs/include。
- 进入链接器 > 惯例 > 附加库目录菜单,点击编辑,并在弹出窗口中解压的 libs/x86 或 libs/x86_64。
- 进入链接器 > 输出 > 附加依赖项菜单,点击编辑,并在弹出窗口中解压的 agora_rtc_sdk.lib。
实现音视频直播
本节介绍如何实现音视频直播。视频直播的 API 应用时序见下图:
1. 创立用户界面
为直观地体验 音视频 通话,需依据利用场景创立用户界面(UI)。若我的项目中已有用户界面,间接查看初始化 IRtcEngine。
如果你想实现一个视频直播,举荐在 UI 上增加以下控件:
- 主播视频窗口
- 来到频道按钮
当你应用示例我的项目中的 UI 设计时,你将会看到如下界面:
2. 初始化 IRtcEngine
在调用其余 Agora API 前,须要创立并初始化 IRtcEngine 对象。
你须要在该步骤中填入我的项目的 App ID。请参考如下步骤在控制台创立 Agora 我的项目并获取 App ID。
1. 登录控制台,点击左侧导航栏的项目管理图标 。
2. 点击创立,依照屏幕提示设置我的项目名,抉择一种鉴权机制,而后点击提交。
3. 在项目管理页面,你能够获取该项目标 App ID。
image1019×537 52.3 KB
调用 createAgoraRtcEngine
和 initialize
办法,传入获取到的 App ID,即可初始化 IRtcEngine
。
你也能够依据需要,在初始化时实现其余性能。如注册用户退出频道和来到频道的回调(在 AgoraObject.h 中申明)。
// 在主播调用 joinChannel 办法后,此回调会报告退出频道的主播信息。BOOL JoinChannel(LPCTSTR lpChannelName, UINT nUID = 0, LPCSTR lpDynamicKey = NULL);
// 在主播调用 leaveChannel 办法后,此回调会报告来到频道的主播信息。BOOL LeaveCahnnel();
// 静音本地音频
BOOL MuteLocalAudio(BOOL bMuted = TRUE);
BOOL IsLocalAudioMuted();
// 静音所有远端音频
BOOL MuteAllRemoteAudio(BOOL bMuted = TRUE);
BOOL IsAllRemoteAudioMuted();
// 静音本地视频
BOOL MuteLocalVideo(BOOL bMuted = TRUE);
BOOL IsLocalVideoMuted();
// 静音所有远端视频
BOOL MuteAllRemoteVideo(BOOL bMuted = TRUE);
BOOL IsAllRemoteVideoMuted();
BOOL IsAllRemoteVideoMuted();
3. 设置频道模式
初始化完结后,调用 setChannelProfile
办法,将频道模式设为直播。
一个 IRtcEngine 只能应用一种频道模式。如果想切换为其余模式,须要先调用 release
办法开释以后的 IRtcEngine 实例,而后调用 createAgoraRtcEngine
和 initialize
办法创立一个新实例,再调用 setChannelProfile
设置新的频道模式。
BOOL SetChannelProfile(BOOL bBroadcastMode);
BOOL IsBroadcastMode();
4. 设置用户角色
直播频道有两种用户角色:主播和观众,其中默认的角色为观众。设置频道模式为直播后,你能够在 App 中参考如下步骤设置用户角色:
- 让用户抉择本人的角色是主播还是观众
- 调用
setClientRole
办法,而后应用用户抉择的角色进行传参
留神,直播频道内的用户,只能看到主播的画面、听到主播的声音。退出频道后,如果你想切换用户角色,也能够调用 setClientRole
办法。
// 在 AgoraObject.h 中申明
BOOL SetClientRole(CLIENT_ROLE_TYPE role, LPCSTR lpPermissionKey = NULL);
int GetClientRole() { return m_nRoleType;};
// 在 AgoraObject.cpp 实现
BOOL CAgoraObject::SetClientRole(CLIENT_ROLE_TYPE role, LPCSTR lpPermissionKey)
{
// 设置用户角色。int nRet = m_lpAgoraEngine->setClientRole(role);
m_nRoleType = role;
return nRet == 0 ? TRUE : FALSE;
}
/ 创立抉择用户角色的对话框。void CEnterChannelDlg::OnCbnSelchangeCmbRole()
{int nSel = m_ctrRole.GetCurSel();
if (nSel == 0)
CAgoraObject::GetAgoraObject()->SetClientRole(CLIENT_ROLE_BROADCASTER);
else
CAgoraObject::GetAgoraObject()->SetClientRole(CLIENT_ROLE_AUDIENCE);
}
5. 设置本地视图
如果你想实现一个语音直播,能够间接查看退出频道。
胜利初始化 IRtcEngine 对象后,须要在退出频道前设置本地视图,以便主播在直播中看到本地图像。参考以下步骤设置本地视图(OpenLiveDig.cpp):
- 调用
enableVideo
办法启用视频模块。 - 调用
setupLocalVideo
办法设置本地视图。
// 启用视频模块。CAgoraObject::GetAgoraObject()->EnableVideo(TRUE);
// 设置本地视图。VideoCanvas vc;
vc.uid = 0;
vc.view = m_dlgVideo.GetLocalVideoWnd();
vc.renderMode = RENDER_MODE_TYPE::RENDER_MODE_FIT;
//cancel setVideoProfile bitrate since version 2.1.0
int nVideoSolution = m_dlgSetup.GetVideoSolution();
//
VideoEncoderConfiguration config;
config.bitrate = m_dlgSetup.GetBirate();
config.frameRate = (FRAME_RATE)m_dlgSetup.GetFPS();
SIZE resolution = m_dlgSetup.GetVideoResolution();
config.dimensions.width = resolution.cx;
config.dimensions.height = resolution.cy;
lpRtcEngine->setVideoEncoderConfiguration(config);
//
m_dlgVideo.SetWindowText(strChannelName);
lpRtcEngine->setupLocalVideo(vc);
lpRtcEngine->startPreview();
6. 退出频道
实现设置角色和本地视图后(视频直播场景),你就能够调用 joinChannel
办法退出频道。你须要在该办法中传入如下参数:
channelName
: 传入能标识频道的频道 ID。输出频道 ID 雷同的用户会进入同一个频道。-
token:传入能标识用户角色和权限的 Token。可设为如下一个值:若我的项目已启用 App 证书,请应用 Token。
NULL
- 长期 Token。长期 Token 服务有效期为 24 小时。你能够在控制台里生成一个长期 Token,详见获取长期 Token。
- 在你的服务器端生成的 Token。在平安要求高的场景下,咱们举荐你应用此种形式生成的 Token,详见生成 Token。
uid
: 本地用户的 ID。数据类型为整型,且频道内每个用户的uid
必须是惟一的。若将uid
设为 0,则 SDK 会主动调配一个uid
,并在onJoinChannelSuccess
回调中报告。
更多的参数设置注意事项请在声网文档核心查找并参考 joinChannel
接口中的参数形容。
// 退出频道。std::string token = lpAgoraObject->GetToken();
lpAgoraObject->JoinChannel(strChannelName, 0, token.length() > 0 ? token.c_str() : NULL);
7. 设置远端视图
视频直播中,不管你是主播还是观众,都应该看到频道中的所有主播。在退出频道后,可通过调用 setupRemoteVideo
办法设置远端主播的视图。
远端主播胜利退出频道后,SDK 会触发 onFirstRemoteVideoDecoded
回调,该回调中会蕴含这个主播的 uid
信息。在该回调中调用 setupRemoteVideo
办法,传入获取到的 uid
,设置该主播的视图(AGEngineEventHandler.h)。
// 在引擎收到第一帧远端视频流并解码胜利时,会触发此回调(AGEngineEventHandler.cpp)。void CAGEngineEventHandler::onFirstRemoteVideoDecoded(uid_t uid, int width, int height, int elapsed)
{
LPAGE_FIRST_REMOTE_VIDEO_DECODED lpData = new AGE_FIRST_REMOTE_VIDEO_DECODED;
lpData->uid = uid;
lpData->width = width;
lpData->height = height;
lpData->elapsed = elapsed;
if(m_hMainWnd != NULL)
::PostMessage(m_hMainWnd, WM_MSGID(EID_FIRST_REMOTE_VIDEO_DECODED), (WPARAM)lpData, 0);
}
8. 来到频道
依据场景须要,如完结通话、敞开 App 或 App 切换至后盾时,调用 leaveChannel
来到以后通话频道。
BOOL CAgoraObject::LeaveCahnnel()
{m_lpAgoraEngine->stopPreview();
int nRet = m_lpAgoraEngine->leaveChannel();
m_nSelfUID = 0;
bJoinedChannel = false;
return nRet == 0 ? TRUE : FALSE;
}
// 敞开引擎
void CAgoraObject::CloseAgoraObject()
{if(m_lpAgoraEngine != NULL)
m_lpAgoraEngine->release();
if(m_lpAgoraObject != NULL)
delete m_lpAgoraObject;
m_lpAgoraEngine = NULL;
m_lpAgoraObject = NULL;
}
示例代码
你能够在 OpenLive-Windows 示例代码中查看残缺的源码和代码逻辑,本文应用的是 C ++ 的 MFC 我的项目。
github:https://github.com/AgoraIO/Ba…
运行我的项目
在 Windows 设施中运行该我的项目。当胜利开始视频直播时,主播能够看到本人的画面;观众能够看到主播的画面(以后配置为 Debug 模式,x64 零碎)。
// 关上界面
// 测试摄像头
// 开始直播, 厚码
image938×715 109 KB