BRTC 支持屏幕分享,即将当前系统的屏幕内容通过 BRTC SDK 分享给房间里的其他用户。屏幕分享不但支持“辅路分享”, 也支持使用”主视频流“进行分享。使用主路视频流屏幕分享时,摄像头的采集需要先被停止,否则会相互冲突。 屏幕共享功能需要在加入房间后,再调用相应函数启动或者关闭。在启动屏幕分享时通过参数指定使用的线路。百家云 SDK 的屏幕共享特性可提供以下功能,适用于各种场景下的屏幕共享。
将你的整个屏幕进行共享,包括屏幕中的所有信息,该功能支持同时采集两块屏幕的信息并共享。
共享 app 窗口
如果你不希望将整个屏幕内容分享给其他用户,可以只共享一个 app 窗口中的画面。
共享指定区域
如果你只希望共享屏幕或 app 窗口中的一部分,可以在开启屏幕共享时设置一个共享区域,只有该区域内的画面会被分享。
调用 getScreenCaptureSources ,获取可共享的屏幕和窗口的对象列表,列表中包含窗口 ID 和屏幕 ID 等重要信息。方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。
// 获取指定的可共享窗口或屏幕的信息。 BRTCScreenCaptureSourceList* wndInfoList = m_pBrtc->getScreenCaptureSources(SIZE{120, 70}, SIZE{20, 20}); for (size_t i = 0; i < wndInfoList->getCount(); i++) { // 返回可共享窗口或屏幕的信息 BRTCScreenCaptureSourceInfo info = wndInfoList->getSourceInfo(static_cast<uint32_t>(i)); } wndInfoList->release();
根据实际应用场景,在以下 3 种屏幕共享方式中任选一种。
// 指定共享整个屏幕,rect 设为 { 0, 0, 0, 0 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeScreen, info.sourceId, rect, property); m_pBrtc->startScreenCapture(nullptr, BRTCVideoStreamTypeSub, nullptr);
// 指定共享整个屏幕的指定区域,rect 设为 { 10, 20, 300, 300 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeScreen, info.sourceId, rect, property); m_pBrtc->startScreenCapture(nullptr, BRTCVideoStreamTypeSub, nullptr);
// 指定共享的 app 窗口,rect 设为 { 0, 0, 0, 0 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeWindow, info.sourceId, rect, property); m_pBrtc->startScreenCapture(nullptr, BRTCVideoStreamTypeSub, nullptr);
// 指定共享 app 窗口的指定区域,rect 设为 { 10, 10, 100, 200 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeWindow, info.sourceId, rect, property); m_pBrtc->startScreenCapture(nullptr, BRTCVideoStreamTypeSub, nullptr);
在房间内,你可以调用如下方法动态更新屏幕共享区域或参数。
// 指定共享 app 窗口的指定区域,rect 设为 { 10, 10, 100, 200 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeWindow, info.sourceId, rect, property);
在房间内,你可以修改参数值对共享区域或者窗口描边。 将 BRTCScreenCaptureProperty 中的 enableHighLight 设置为 true,并同时设置 highLightColor 和 highLightWidth 来指定描边的颜色和宽度。
BRTCScreenCaptureProperty property = uiShareSelect.getProperty(); property.enableHighLight = true; property.highLightColor = 0xFFFF0000; property.highLightWidth = 15; // 指定共享 app 窗口的指定区域,rect 设为 { 10, 10, 100, 200 } m_pBrtc->selectScreenCaptureTarget(BRTCScreenCaptureSourceTypeWindow, info.sourceId, rect, property);
调用 stopScreenCapture,在教室内停止屏幕共享。
// 停止屏幕共享 m_pBrtc->stopScreenCapture();
通过设置 [startScreenCapture()] 中的参数 encParams ,您可以指定屏幕分享的编码质量。如果您指定 encParams 为 null,SDK 会自动选择最佳的编码参数,我们推荐的参数设定如下:
encParams
//屏幕分享窗口的提示窗口初始化 void UiShareSelect::InitWindow() { CTileLayoutUI* pLayout = static_cast<CTileLayoutUI*>(m_pm.FindControl(_T("layoutBody"))); if (!pLayout) { return; } // 清空显示可以屏幕分享的窗口中的可选item pLayout->RemoveAll(); BRTCScreenCaptureSourceList* wndInfoList = BRTCCore::GetInstance()->getBRTC()->getScreenCaptureSources(SIZE{120, 70}, SIZE{20, 20}); if (!wndInfoList) { return; } LOG(INFO) << "wnd count: " << wndInfoList->getCount(); for (size_t i = 0; i < wndInfoList->getCount(); i++) { ShareSelectItem* pItem = new ShareSelectItem(); CVerticalLayoutUI* pUi = pItem->CreateUi(&m_pm); pUi->SetFixedWidth(150); pUi->SetFixedHeight(100); pItem->setSourceInfo(wndInfoList->getSourceInfo(static_cast<uint32_t>(i))); // 将每个可选的屏幕分享窗口显示到提示窗口中 pLayout->Add(pUi); m_vecShareSelectItem.push_back(pItem); } wndInfoList->release(); } void MainViewBottomBar::OnBtnScreenClicked() { UiShareSelect uiShareSelect; uiShareSelect.Create(m_pMainWnd->GetHWND(), _T("选择分享内容"), UI_WNDSTYLE_DIALOG, 0); uiShareSelect.CenterWindow(); UINT nRet = uiShareSelect.ShowModal(); if (nRet == IDOK) { ScreenCaptureSourceItemInfo info = uiShareSelect.getSelectWndInfo(); RECT rect = uiShareSelect.getRect(); BRTCScreenCaptureProperty property = uiShareSelect.getProperty(); // 设置用户选择的屏幕分享参数 BRTCCore::GetInstance()->getBRTC()->selectScreenCaptureTarget(info.type, info.sourceId, rect, property); // 启动屏幕分享 BRTCCore::GetInstance()->getBRTC()->startScreenCapture(nullptr, BRTCVideoStreamTypeSub, nullptr); } }
屏幕分享
BRTC 支持屏幕分享,即将当前系统的屏幕内容通过 BRTC SDK 分享给房间里的其他用户。
屏幕分享不但支持“辅路分享”, 也支持使用”主视频流“进行分享。使用主路视频流屏幕分享时,摄像头的采集需要先被停止,否则会相互冲突。 屏幕共享功能需要在加入房间后,再调用相应函数启动或者关闭。在启动屏幕分享时通过参数指定使用的线路。
百家云 SDK 的屏幕共享特性可提供以下功能,适用于各种场景下的屏幕共享。
将你的整个屏幕进行共享,包括屏幕中的所有信息,该功能支持同时采集两块屏幕的信息并共享。
共享 app 窗口
如果你不希望将整个屏幕内容分享给其他用户,可以只共享一个 app 窗口中的画面。
共享指定区域
如果你只希望共享屏幕或 app 窗口中的一部分,可以在开启屏幕共享时设置一个共享区域,只有该区域内的画面会被分享。
获取资源列表
调用 getScreenCaptureSources ,获取可共享的屏幕和窗口的对象列表,列表中包含窗口 ID 和屏幕 ID 等重要信息。方便用户通过列表中的缩略图选择共享某个显示器的屏幕或某个窗口。
开启屏幕分享
根据实际应用场景,在以下 3 种屏幕共享方式中任选一种。
更新共享区域或参数
在房间内,你可以调用如下方法动态更新屏幕共享区域或参数。
对屏幕描边
在房间内,你可以修改参数值对共享区域或者窗口描边。 将 BRTCScreenCaptureProperty 中的 enableHighLight 设置为 true,并同时设置 highLightColor 和 highLightWidth 来指定描边的颜色和宽度。
停止屏幕共享
调用 stopScreenCapture,在教室内停止屏幕共享。
设定视频编码参数
通过设置 [startScreenCapture()] 中的参数
encParams
,您可以指定屏幕分享的编码质量。如果您指定encParams
为 null,SDK 会自动选择最佳的编码参数,我们推荐的参数设定如下:观看屏幕分享
示例代码