在互动直播或视频通话中,主播或视频通话用户可以通过声网 SDK 中的屏幕共享特性,将自己的屏幕内容以视频的方式分享给其他用户或观众观看。
屏幕共享可以应用在以下场景中:
场景 | 描述 |
---|---|
在线教育 | 老师将自己的屏幕、教学课件、绘图软件或编程软件共享给学生,用于课堂示范 |
游戏直播 | 主播共享自己的游戏画面给观众 |
互动直播 | 主播共享自己的屏幕和观众互动 |
视频会议 | 会议成员共享屏幕观看 PPT 或者文档 |
远程控制 | 被控端向主控端展示自己的桌面 |
声网 SDK 的屏幕共享特性可提供以下功能,适用于各种场景下的屏幕共享。
将你的整个屏幕进行共享,包括屏幕中的所有信息,该功能支持同时采集两块屏幕的信息并共享。
如果你不希望将整个屏幕内容分享给其他用户,可以只共享一个 app 窗口中的画面。
如果你只希望共享屏幕或 app 窗口中的一部分,可以在开启屏幕共享时设置一个共享区域,只有该区域内的画面会被分享。
除上述功能外,你还可以在开启屏幕共享时通过调整参数,实现以下高级共享功能:
屏幕共享功能在各平台的适用情况如下:
声网提供的屏幕共享特性具备以下优势:
超高清画质体验
支持超高清视频(分辨率为 4K,帧率为 60 fps),给用户带来更加流畅、高清的极致画面体验。
多 app 支持
适配 WPS Office、Microsoft Office Power Point、Visual Studio Code、Adobe Photoshop、Windows Media Player 和 Scratch 等多款主流 app,方便用户在屏幕共享时直接共享指定 app、提升了功能易用性。
多设备支持
支持多设备同时共享,兼容 Window 8 系统、无独立显卡的设备、双显卡设备、外接屏幕设备等,满足各种场景下的设备使用需求。
多平台适配
支持 iOS、Andriod、macOS、Windows、Web、Unity、Flutter、React Native、Unreal Engine 等平台。
高安全保障
支持仅共享 app 和屏幕中的部分区域内容,并支持屏蔽指定 app 窗口,有效保障用户信息安全。
如果要在屏幕共享时共享 4K 分辨率的超高清视频,你的设备需要满足一定要求,声网推荐的最低设备规格为:intel(R) Core(TM) i7-9750H CPU @ 2.60GHZ。
libagora_screen_capture_extension.dll
),否则会导致该功能无法正常使用。本节介绍如何在你的项目中实现屏幕共享,API 调用时序如下图所示。
开启屏幕共享有如下两种方案,你可以根据实际场景进行选择:
startScreenCaptureByDisplayId
或 startScreenCaptureByWindowId
,然后调用 joinChannel
[2/2] 加入频道并设置 publishScreenTrack
或 publishSecondaryScreenTrack
为 true
,即可开始屏幕共享。startScreenCaptureByDisplayId
或 startScreenCaptureByWindowId
,然后调用 updateChannelMediaOptions
设置 publishScreenTrack
或 publishSecondaryScreenTrack
为 true
,即可开始屏幕共享。 本文中的流程图和步骤均以第一种方案为例。
参考如下具体步骤,实现屏幕共享。
调用 getScreenCaptureSources
,获取可共享的屏幕和窗口的对象列表,列表中包含窗口 ID 和屏幕 ID 等重要信息。方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。示例代码如下:
{
// 获取指定的可共享窗口或屏幕的信息。
agora::rtc::IScreenCaptureSourceList* listCapture = m_rtcEngine->getScreenCaptureSources(sz, sz, true);
for (int i = 0; i < listCapture->getCount(); i++)
{
// 返回可共享窗口或屏幕的信息
agora::rtc::ScreenCaptureSourceInfo info = listCapture->getSourceInfo(i);
}
// 获取可共享的窗口和屏幕的个数。
return static_cast<int>(m_listWnd.GetCount());
}
根据实际应用场景,在以下 3 种屏幕共享方式中任选一种。
调用 startScreenCaptureByDisplayId
开始共享整个屏幕,参数设置如下:
将 displayId
设置为上一步获取到的 sourceId
(屏幕 ID)。
在 captureParams
中设置你预期的视频编码属性。
dimensions
设置为 1920 × 1080;frameRate
设置为 10 fps。dimensions
设置为 960 × 720;frameRate
设置为 15 fps。// 开始共享指定的屏幕
m_rtcEngine->startScreenCaptureByDisplayId(id, regionRect, capParam);
调用 startScreenCaptureByWindowId
开始共享整个 app 窗口,参数设置如下:
windowId
设置为上一步获取到的 sourceId
(窗口 ID)。captureParams
中设置你预期的视频编码属性。dimensions
设置为 1920 × 1080;frameRate
设置为 10 fps。dimensions
设置为 960 × 720;frameRate
设置为 15 fps。// 开始共享指定的 app 窗口
ret = m_rtcEngine->startScreenCaptureByWindowId(hWnd, rcCapWnd, capParam);
调用 startScreenCaptureByDisplayId
或 startScreenCaptureByWindowId
方法开始共享,并将 regionRect
设置为你想要共享的区域相对于整个屏幕或窗口的位置。示例代码如下:
// 设置你想要共享的区域参数。
// 如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果宽或高设为 0,则共享整个屏幕。
m_screenRegion = { 0,0,heightX,heightY };
agora::rtc::Rectangle rcCapWnd = { m_screenRegion.x, m_screenRegion.y, (int)(m_screenRegion.width * scale), (int)(m_screenRegion.height * scale) };
...
m_rtcEngine->startScreenCaptureByDisplayId(id, rcCapWnd, m_screenParam);
调用 setScreenCaptureScenario
方法设置屏幕共享场景,按照实际使用场景,将 screenScenario
设置为以下任意一种:
SCREEN_SCENARIO_DOCUMENT(1)
:文档场景SCREEN_SCENARIO_GAMING(2)
:游戏场景SCREEN_SCENARIO_VIDEO(3)
:视频场景SCREEN_SCENARIO_RDC(4)
:远程控制场景示例代码如下:
m_rtcEngine->setScreenCaptureScenario(type);
调用 joinChannel
[2/2] 加入频道并设置频道媒体选项。示例代码如下:
// 设置频道媒体选项
ChannelMediaOptions option;
option.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING;
option.clientRoleType = CLIENT_ROLE_BROADCASTER;
option.publishMicrophoneTrack = true;
// 在频道中发布屏幕采集的视频
// 如果要在频道中发布第二个屏幕采集的视频,则将下一行代码替换为 option.publishSecondaryScreenTrack = true;
option.publishScreenTrack = true;
// 加入频道
m_rtcEngine->joinChannel("Your Token", "Your ChannelId", 0, option)
joinChannel
[2/2] 加入第一个频道,在该频道中发布摄像头采集的视频流。joinChannelEx
加入第二个频道,在该频道中发布屏幕共享流。在频道中,你可以调用如下方法动态更新屏幕共享区域或参数:
updateScreenCaptureRegion
方法,重新设置 regionRect
参数、划定新的共享区域。updateScreenCaptureParameters
方法,更新 captureParams
参数的配置。示例代码如下:
// 更新屏幕共享区域
int ret = m_rtcEngine->updateScreenCaptureRegion(rect);
// 更新屏幕共享参数
int ret = m_rtcEngine->updateScreenCaptureParameters(m_screenParam);
根据实际使用场景,你可以通过以下两种方式对屏幕或窗口进行描边。
startScreenCaptureByDisplayId
、startScreenCaptureByWindowId
,将 captureParams
中的 enableHighLight
设置为 true
,并同时设置 highLightColor
和 highLightWidth
来指定描边的颜色和宽度。updateScreenCaptureParameters
,将 captureParams
中的 enableHighLight
设置为 true
,并同时设置 highLightColor
和 highLightWidth
来指定描边的颜色和宽度。bool highLigne = m_chkHighLight.GetCheck();
m_screenParam.enableHighLight = highLigne;
// 设置屏幕的描边颜色
m_screenParam.highLightColor = 0xFFFF0000;
// 设置屏幕的描边宽度
m_screenParam.highLightWidth = 5;
// 开启屏幕描边
int ret = m_rtcEngine->updateScreenCaptureParameters(m_screenParam);
根据实际使用场景,你可以通过以下两种方式屏蔽指定的窗口。
startScreenCaptureByDisplayId
,将 captureParams
中的 excludeWindowList
设置为你想要屏蔽的窗口列表。在开启屏幕共享后屏蔽窗口:调用 updateScreenCaptureParameters
,将 captureParams
中的 excludeWindowList
设置为你想要屏蔽的窗口列表。m_screenParam.excludeWindowList = excludeViews;
m_screenParam.excludeWindowCount = count;
int ret = m_rtcEngine->updateScreenCaptureParameters(m_screenParam);
调用 stopScreenCapture
,在频道内停止屏幕共享。示例代码如下:
// 停止屏幕共享
ret = m_rtcEngine->stopScreenCapture();
介绍关于屏幕共享的更多参考信息。
我们在 GitHub 提供了一个开源的示例项目,你可以前往下载体验。