【最佳实践】巡检项:实时音视频 (TRTC) 检查原生平台 SDK开启屏幕分享是否成功

2023-05-09 12:12:00 浏览数 (2)

问题/风险描述:

在腾讯云实时音视频TRTC中,当您在移动设备或者 Windows/Mac 系统的设备上使用开启屏幕分享接口时,可能会遇到开启失败的问题,对应的就是TRTC的回调onError接口抛出ERR_SCREEN_CAPTURE_START_FAIL -1308错误码。其中在移动设备或者Mac系统的设备上,可能是没有相关屏幕分享的权限,而在 Windows 或 Mac 系统的设备上,则需要检查录屏接口的参数是否符合要求。这些问题都会导致录屏接口无法正常工作。

移动端工具栏移动端工具栏
mac端开启屏幕共享权限mac端开启屏幕共享权限

在Window或者Mac上还可能是因为设置进来的sourceId无效,或者sourceType跟sourceId不匹配,比如传入的sourceId是窗口的id,但是sourceType填入的是Screen,从而导致分享失败。

解决方案:

为了解决这些问题,我们建议您可以采取以下措施:

1. 在移动设备上,您可以引导用户去开启应用的权限,以允许应用可以使用录屏功能。您可以使用系统提供的提示信息,来引导用户打开对应的权限设置页面。

2. 在 Windows 或 Mac 系统的设备上,您需要检查录屏接口的参数是否符合要求

屏幕分享参数设置与情况屏幕分享参数设置与情况

以下是Window屏幕分享的代码

代码语言:javascript复制
/**
 * TRTC 屏幕分享(选择窗口)
 *
 * - 核心逻辑实现参考:
 * - 1. initScreenCaptureSources()          : 通过getScreenCaptureSources()获取可分享的屏幕窗口,包含屏幕和应用窗口两种类型,在返回值中,仅保留TRTCScreenCaptureSourceType为TRTCScreenCaptureSourceTypeWindow的窗口
 * - 2. initScreenSharingWindowSelections() : 将获取到的TRTCScreenCaptureSourceInfo列表展示到UI上,供用户选择
 * - 3. selectScreenCaptureTarget()         : 设置屏幕分享参数,具体参数可参考test_screen_share_setting.h
 * - 4. startScreenSharing()                : 开始屏幕分享
 * - 5. pauseScreenCapture()                : 暂停屏幕分享
 * - 6. resumeScreenCapture()               : 恢复屏幕分享
 * - 7. stopScreenSharing()                 : 停止屏幕分享
 * - 8. releaseScreenCaptureSourceList()    : 遍历完窗口列表后,需要调用release释放资源。
 */
 //通过getScreenCaptureSources()获取可分享的屏幕窗口,包含屏幕和应用窗口两种类型,在返回值中,仅保留TRTCScreenCaptureSourceType为TRTCScreenCaptureSourceTypeWindow的窗口
 void TestScreenShareSelectWindow::initScreenCaptureSources(){
    SIZE thumb_size;
#ifdef __APPLE__
    thumb_size.width = 300;
    thumb_size.height = 300;
#else
    thumb_size.cx = 300;
    thumb_size.cy = 300;
#endif
    SIZE icon_size = thumb_size;
    screen_capture_list_ = getTRTCShareInstance()->getScreenCaptureSources(thumb_size, icon_size);
}

//将获取到的TRTCScreenCaptureSourceInfo列表展示到UI上,供用户选择
void TestScreenShareSelectWindow::initScreenSharingWindowSelections() {
    initScreenCaptureSources();
    if (screen_capture_list_ == nullptr){
        return;
    }

    int screen_capture_size = screen_capture_list_->getCount();
    trtc::TRTCScreenCaptureSourceInfo screen_capture_source_info;
    int child_window_item_index = 0;
    for (int screen_index = 0; screen_index < screen_capture_size; screen_index  ) {
        screen_capture_source_info = screen_capture_list_->getSourceInfo(screen_index);
        if(screen_capture_source_info.type != trtc::TRTCScreenCaptureSourceTypeWindow){
            continue;
        }

        addScreenSharingWindowItem(screen_capture_source_info, child_window_item_index);
        child_window_item_index  ;
    }
    ui_screen_share_select_window_->scrrenSharingWindows->adjustSize();
}

//设置屏幕分享参数,具体参数可参考test_screen_share_setting.h
void TestScreenShareSelectWindow::selectScreenCaptureTarget(trtc::TRTCScreenCaptureSourceInfo sourceInfo){
    getTRTCShareInstance()->selectScreenCaptureTarget(
        sourceInfo
        , sharing_rect_
        , capture_property_);
}

//监听 点击开启屏幕分享
void TestScreenShareSelectWindow::startScreenSharing(){
    getTRTCShareInstance()->startScreenCapture(reinterpret_cast<trtc::TXView>(ui_screen_share_select_window_->screenSharedPreview->winId()),
        stream_type_,
        &enc_param_);
}

void TestScreenShareSelectWindow::resumeScreenCapture(){
    getTRTCShareInstance()->resumeScreenCapture();
}

void TestScreenShareSelectWindow::pauseScreenCapture(){
    getTRTCShareInstance()->pauseScreenCapture();
}

void TestScreenShareSelectWindow::stopScreenSharing(){
    getTRTCShareInstance()->stopScreenCapture();
    if(test_user_video_group_){
        getTRTCShareInstance()->startLocalPreview(test_user_video_group_->getLocalVideoTxView());
    }
}

void TestScreenShareSelectWindow::releaseScreenCaptureSourceList(){
    if (screen_capture_list_ != nullptr) {
        screen_capture_list_->release();
        screen_capture_list_ = nullptr;
    }
}

注意事项:

无论您遇到的是哪种问题,都需要在调用开启屏幕分享接口之前,对录屏权限和接口参数进行仔细的检查和确认。只有在保证开启屏幕分享接口的正常工作前提下,您才能顺利地完成屏幕分享功能的开发。

0 人点赞