在实时通信中,如果你希望用户可以分享本端设备的屏幕和设备播放的音频,可以使用 RTC 内建的屏幕采集功能,也可以自行实现屏幕采集逻辑(自定义采集),并通过屏幕共享功能,与远端用户共享。
仅可见的用户可以发布屏幕流。
你可以在多种行业的多种场景下使用到屏幕共享功能:
| 行业 | 场景 |
|---|---|
| 在线教育 | 老师共享屏幕给学生上课;美术老师共享屏幕给学生教画画。 |
| 游戏直播 | 主播共享屏幕给观众,展现自己的游戏画面。 |
| 互动直播 | 主播共享自己的屏幕和观众互动。 |
| 视频会议 | 会议成员共享屏幕观看 PPT 或者文档。 |
操作系统版本要求如下:
你已经集成 Windows/ Mac 端 RTC SDK,实现了基本的音视频通话。

调用以下接口,以便用户在发起共享前,看到可以共享的屏幕/窗口的缩略图等信息,并指定共享对象。
getScreenCaptureSourceList 接口获取共享对象列表:
应用窗体:kScreenCaptureSourceTypeWindow
显示器屏幕:kScreenCaptureSourceTypeScreen。 Windows 端的虚拟桌面的 source_id 为 -1。
ScreenCaptureSourceInfo中的region_rect为采集源的坐标,在以主屏左上角为原点的坐标系下,的采集源的逻辑坐标和分辨率信息
getThumbnail 接口获取共享对象缩略图,并支持设置宽、高。getWindowAppIcon 获取应用图标。
void AppBusiLogic::SDKGetAppIconAndShow(bool show, int width, int height) {
if (!show && mAppIconView) {
mAppIconView->hide();
} else if (show) {
bytertc::ScreenCaptureSourceInfo info = mCurScreenSourceInfo;
bytertc::IVideoFrame* videoFrame = mByteEngineWrapper->GetWindowAppIcon(info.source_id, width, height);
if (info.type != bytertc::kScreenCaptureSourceTypeWindow || !videoFrame) {
ToastForm::toast(TEXT("获取应用图标失败"), 2000, ToastForm::TipsToast,
WindowMgr::GetInstance().Find(WindowMgr::RTC_CALL_SETTTING));
return;
}
QImage image;
if (videoFrame->pixelFormat() == bytertc::kVideoPixelFormatRGBA) {
image = QImage(videoFrame->getPlaneData(0), videoFrame->width(),
videoFrame->height(), QImage::Format_RGBA8888);
} else if (videoFrame->pixelFormat() == bytertc::kVideoPixelFormatARGB) {
image = QImage(videoFrame->getPlaneData(0), videoFrame->width(),
videoFrame->height(), QImage::Format_ARGB32);
}
if (!mAppIconView) {
mAppIconView = new PixmapButton();
auto settingWdg = WindowMgr::GetInstance().Find(WindowMgr::RTC_CALL_SETTTING);
mAppIconView->move(settingWdg->x(), 0);
}
QString title = QString::number(videoFrame->width()) + "x" + QString::number(videoFrame->height());
mAppIconView->setWindowTitle(title);
mAppIconView->makePixmapBtn(QPixmap::fromImage(image));
mAppIconView->setMinimumSize(200, 200);
mAppIconView->show();
videoFrame->release();
}
c++(可选)设置屏幕视频流的采集参数
调用 setVideoEncoderConfig 设置屏幕视频流的采集帧率和编码分辨率。
- 当共享对象原始分辨率超过目标宽、高时,将保持视频帧宽高比,缩小到目标宽、高。
- 当共享对象分辨率小于目标宽高时,将保持原始宽高,不进行“放大”。
调用 startScreenVideoCapture 开启屏幕采集
ScreenCaptureParameters对象中的HighlightConfig参数为共享的屏幕/窗口添加边框标志,用来向用户提示此窗口正在被共享。RTC 建议在屏幕共享时排除应用程序自身窗口。你可以通过设置ScreenFilterConfig参数排除指定窗口。
设备音频默认为一路单独的音频流完成处理和发布。调用
setScreenAudioStreamIndex可以将设备音频混入到主流的音频中。
Windows:调用无参接口 startScreenAudioCapture 开启屏幕音频采集,即声卡播放出来的声音。
Mac:v3.43.1 及以上版本 SDK 支持在 Mac 端共享设备音频。
1. 安装虚拟声卡。推荐安装由 RTC 提供的 VeRTCVirtualSoundCard。
2. 调用接口 getDevice获取虚拟声卡设备 ID。
3. 调用带参接口 startScreenAudioCapture 传入虚拟声卡设备 ID,开启设备音频采集。
开始发布屏幕流后,可以通过以下接口更新屏幕采集设置。
调用 updateScreenCaptureRegion 更新采集区域。如果要更新共享的屏幕/窗口,你需要重新发起共享。
调用 updateScreenCaptureHighlightConfig 更新边框高亮设置。
调用 updateScreenCaptureFilterCofig 更新需要过滤的窗口。
调用 updateScreenCaptureMouseCursor 更新是否采集鼠标信息的设置。
RTC 强烈建议你使用内部采集。如果你仍然希望使用自定义采集,参看以下步骤。
实现屏幕音视频流采集逻辑。
调用 setScreenAudioSourceType 设置屏幕音频自定义采集。
调用 pushScreenAudioFrame 和 PushScreenAudioFrame 将采集得到的音视频帧推送到 RTC SDK 用于编码传输。
publishScreen 发布屏幕共享流。调用一次
publishScreen同时发布音视频与多次调用该接口,分别只发布音频、只发布视频结果是相同的。
unpublishScreen 关闭屏幕共享。远端用户发布屏幕音视频流后,RTC 通过 onUserPublishScreen 通知本地用户。通过 subscribeScreen 手动订阅屏幕音视频流。订阅后,屏幕音频流即可正常播放。
如果已经在进房时开启自动订阅,则无需进行手动订阅。
屏幕视频流正常解码后收到 onFirstRemoteVideoFrameDecoded 首帧解码回调,并通过 setRemoteVideoSink 或者 setRemoteVideoCanvas 将屏幕视频渲染出来。
以下是各个平台的相关API参考:
部分 Windows 7 设备在屏幕共享过程中,如果使用媒体播放器播放视频,例如, Windows 自带播放器或 QuickTime,远端无法在画面中看到正在播放的视频。