在实时通信中,如果你希望用户可以分享本端设备的屏幕和设备播放的音频,可以使用 RTC 内建的屏幕采集功能,也可以自行实现屏幕采集逻辑(自定义采集),并通过屏幕共享功能,与远端用户共享。

仅可见的用户可以发布屏幕流。

适用场景

你可以在多种行业的多种场景下使用到屏幕共享功能:

行业场景
在线教育老师共享屏幕给学生上课;美术老师共享屏幕给学生教画画。
游戏直播主播共享屏幕给观众,展现自己的游戏画面。
互动直播主播共享自己的屏幕和观众互动。
视频会议会议成员共享屏幕观看 PPT 或者文档。
前提条件
功能实现
使用 RTC SDK 内部采集模块采集屏幕音视频流

alt

获取共享对象列表和信息

调用以下接口,以便用户在发起共享前,看到可以共享的屏幕/窗口的缩略图等信息,并指定共享对象。

  1. 调用 getScreenCaptureSourceList 接口获取共享对象列表:
    • 应用窗体:kScreenCaptureSourceTypeWindow

    • 显示器屏幕:kScreenCaptureSourceTypeScreen。 Windows 端的虚拟桌面的 source_id 为 -1。

ScreenCaptureSourceInfo 中的 region_rect 为采集源的坐标,在以主屏左上角为原点的坐标系下,的采集源的逻辑坐标和分辨率信息

  1. 调用 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++
开启设备屏幕采集
  1. (可选)设置屏幕视频流的采集参数
    调用 setVideoEncoderConfig 设置屏幕视频流的采集帧率和编码分辨率。

    • 当共享对象原始分辨率超过目标宽、高时,将保持视频帧宽高比,缩小到目标宽、高。
    • 当共享对象分辨率小于目标宽高时,将保持原始宽高,不进行“放大”。
  2. 调用 startScreenVideoCapture 开启屏幕采集

ScreenCaptureParameters 对象中的 HighlightConfig 参数为共享的屏幕/窗口添加边框标志,用来向用户提示此窗口正在被共享。RTC 建议在屏幕共享时排除应用程序自身窗口。你可以通过设置 ScreenFilterConfig 参数排除指定窗口。

开启设备音频采集

设备音频默认为一路单独的音频流完成处理和发布。调用 setScreenAudioStreamIndex 可以将设备音频混入到主流的音频中。

更新屏幕共享配置

开始发布屏幕流后,可以通过以下接口更新屏幕采集设置。

自定义采集屏幕

RTC 强烈建议你使用内部采集。如果你仍然希望使用自定义采集,参看以下步骤。

  1. 实现屏幕音视频流采集逻辑。

  2. 调用 setScreenAudioSourceType 设置屏幕音频自定义采集。

  3. 调用 pushScreenAudioFrame 和 PushScreenAudioFrame 将采集得到的音视频帧推送到 RTC SDK 用于编码传输。

发布/停止发布屏幕共享流

调用一次 publishScreen 同时发布音视频与多次调用该接口,分别只发布音频、只发布视频结果是相同的。

接收屏幕音视频

远端用户发布屏幕音视频流后,RTC 通过 onUserPublishScreen 通知本地用户。通过 subscribeScreen 手动订阅屏幕音视频流。订阅后,屏幕音频流即可正常播放。

如果已经在进房时开启自动订阅,则无需进行手动订阅。

屏幕视频流正常解码后收到 onFirstRemoteVideoFrameDecoded 首帧解码回调,并通过 setRemoteVideoSink 或者 setRemoteVideoCanvas 将屏幕视频渲染出来。

API 参考

以下是各个平台的相关API参考:

WindowsmacOSElectron
获取共享对象getScreenCaptureSourceListgetScreenCaptureSourceListgetScreenCaptureSourceList
获取共享对象缩略图getThumbnailgetScreenCaptureSourceThumbnail:sourceId:maxWidth:maxHeight:getThumbnail
获取共享窗体程序图标getWindowAppIcongetWindowAppIcongetWindowAppIcon
设置编码属性setVideoEncoderConfigsetVideoEncoderConfig:setVideoEncoderConfig
开始屏幕采集startScreenVideoCapturestartScreenCaptureSourceInfo:captureParameters:startScreenVideoCapture
开始设备音频采集startScreenAudioCapturestartScreenAudioCapture:startScreenAudioCapture
更新采集区域updateScreenCaptureRegionupdateScreenCaptureRegion:updateScreenCaptureRegion
更新高亮控制项updateScreenCaptureHighlightConfigupdateScreenCaptureHighlightConfig:updateScreenCaptureHighlightConfig
更新过滤选项updateScreenCaptureFilterConfigupdateScreenCaptureFilterConfig:updateScreenCaptureFilterCofig
更新鼠标捕获选项updateScreenCaptureMouseCursorupdateScreenCaptureMouseCursor:updateScreenCaptureMouseCursor
发布屏幕流publishScreenpublishScreen:publishScreen
停止发布屏幕流unpublishScreenunpublishScreen:unpublishScreen
切换外部屏幕采集setScreenAudioSourceTypesetScreenAudioSourceType:Not supported.
推送自定义屏幕音频采集数据pushScreenAudioFramepushScreenAudioFrame:Not supported.
推送自定义屏幕视频采集数据pushScreenFramepushScreenCaptureFrame:time:rotation:Not supported.
已知问题

部分 Windows 7 设备在屏幕共享过程中,如果使用媒体播放器播放视频,例如, Windows 自带播放器或 QuickTime,远端无法在画面中看到正在播放的视频。