更新时间:2023-10-26 GMT+08:00
分享

屏幕分享

功能描述

屏幕共享用于在音视频会议中,把一个与会者的屏幕内容,以视频的方式分享给其他与会者。屏幕共享可以共享整个桌面,也可以共享某一个程序窗口。共享程序窗口的时候还可以指定共享该程序窗口的矩形区域。

接口调用流程

实现屏幕共享

  1. 加入房间

    参考接口调用流程中加入房间的时序图步骤加入房间。

  2. 共享桌面

    加入房间后可以调用getScreenShareSources获取屏幕共享对象列表,然后遍历找到其中HRTCScreenShareSourceInfo.type为HRTC_SCREEN_SHARE的对象,该对象就是屏幕对象,再调用setScreenShareTarget设置共享桌面参数。桌面共享不支持区域共享。

    然后调用startScreenShare开始共享。

    还可以调用setAuxiliaryVideoEncodeSmooth来切换屏幕共享的分辨率,从默认的1080p切换为720p。

    示例代码如下:

    //获取引擎
    IHRTCEngine* engine = CRtcEngineMgr::GetInstance()->GetEngine();
    // 定义屏幕共享区域参数
    HRTCSrceenCaptureOptionalInfo optionInfo;
    memset(&optionInfo, 0, sizeof(HRTCSrceenCaptureOptionalInfo));
    // 获取屏幕共享列表,包含桌面共享对象
    IHRTCScreenShareSourceList* sourceList = engine->getScreenShareSources(HRTC_SCREENSHARE_SMALL_ICON);
    unsigned int count = sourceList->count();
    for (unsigned int index = 0; index < count; index++) {
        HRTCScreenShareSourceInfo sourceInfo = sourceList->get(index);
        if (sourceInfo.type == HRTC_SCREEN_SHARE) { //如果是桌面共享对象
            // 调用设置屏幕共享接口
            engine->setScreenShareTarget(&sourceInfo, &optionInfo);
            // 开启屏幕共享
            engine->startScreenShare();
            // 设置屏幕共享编码流畅优先
            engine->setAuxiliaryVideoEncodeSmooth(true);
            break;
        }
    }
  3. 共享程序

    加入房间后也可以调用getScreenShareSources来获取可以共享的程序窗口列表,然后展示在界面上供用户选择。

    选择好需要共享的程序窗口后,调用setScreenShareTarget来设置要共享的程序窗口,其中HRTCScreenShareSourceInfo.type设为HRTC_WINDOW_CAPTURE,HRTCSrceenCaptureOptionalInfo参数用于指定共享的程序窗口的子矩形区域,矩形区域以共享的程序窗口的左上角为原点(0,0),最小96*92 最大1920*1080。如果需要共享该程序的完整窗口,则HRTCSrceenCaptureOptionalInfo参数的矩形区域全填为0。

    然后调用startScreenShare开始共享。

    当HRTCSrceenCaptureOptionalInfo参数的矩形区域填全0时,还可以调用setAuxiliaryVideoEncodeSmooth来切换屏幕共享的分辨率,从默认的1080p切换为720p。

    示例代码如下:

    //获取共享程序窗口列表
    IHRTCEngine* engine = CRtcEngineMgr::GetInstance()->GetEngine();
    IHRTCScreenShareSourceList* sourceList = engine->getScreenShareSources(HRTC_SCREENSHARE_SMALL_ICON);
    unsigned int count = sourceList->getCount();
    for (unsigned int index = 0; index < count; index++) {
    HRTCScreenShareSourceInfo sourceInfo = sourceList->get(index);
    RD_LOG("appshare", "applist name: %s, HWND:%x", sourceInfo.sourceName, sourceInfo.sourceId);
    //将sourceInfo加入列表展示到界面上供用户选择
    }
    
    //用户选择共享的程序后
    int nIdx = m_appList.GetSelectionMark(); //获取用户选择的程序窗口序号
    //获取用户选择的程序窗口序号对应的窗口信息对象
    HRTCScreenShareSourceInfo sourceInfo = m_windowsList[nIdx];
    //获取之前创建的主引擎指针
    IHRTCEngine* engine = CRtcEngineMgr::GetInstance()->GetEngine();
    //设置屏幕共享参数
    HRTCSrceenCaptureOptionalInfo optionInfo;
    memset(&optionInfo, 0, sizeof(HRTCSrceenCaptureOptionalInfo));
    //根据需要设置共享的程序窗口的子矩形区域,如果要共享完整的程序窗口,则矩形区域设为全0
    optionInfo.rect.left = 0;
    optionInfo.rect.top = 0;
    optionInfo.rect.right = 320;
    optionInfo.rect.bottom = 240;
    int ret = engine->setScreenShareTarget(&sourceInfo, &optionInfo);
    ret = engine->startScreenShare();
  4. 接收远端用户的共享流

    收到远端用户开启共享流通知onUserAuxiliaryStreamAvailable后,可以调用startRemoteAuxiliaryStreamView来设置远端用户的共享流的窗口句柄并开始选看。

    还可以再调用updateRemoteRenderMode设置窗口显示共享流的方式。

    示例代码如下:

    engine->startRemoteAuxiliaryStreamView(userId, wndHandle);
  5. 停止屏幕共享

    屏幕共享结束时,可以调用stopScreenShare停止屏幕共享。

    示例代码如下:

    engine->stopScreenShare();
  6. 停止接收远端用户的屏幕共享流

    收到onUserAuxiliaryStreamAvailable消息后,如果选看的远端屏幕共享流不可用,或者收到远端用户下线通知onRemoteUserOffline,则接收端必须调用stopRemoteAuxiliaryStreamView关闭共享流窗口视图。

    如果接收端需要主动停止接收远端用户的共享流,也需要调用stopRemoteAuxiliaryStreamView接口停止接收共享流。

    示例代码如下:

    engine->stopRemoteAuxiliaryStreamView(userId);

相关文档