问题/风险描述:
在腾讯云实时音视频TRTC中,当您在移动设备或者 Windows/Mac 系统的设备上使用开启屏幕分享接口时,可能会遇到开启失败的问题,对应的就是TRTC的回调onError接口抛出ERR_SCREEN_CAPTURE_START_FAIL -1308错误码。其中在移动设备或者Mac系统的设备上,可能是没有相关屏幕分享的权限,而在 Windows 或 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;
}
}
注意事项:
无论您遇到的是哪种问题,都需要在调用开启屏幕分享接口之前,对录屏权限和接口参数进行仔细的检查和确认。只有在保证开启屏幕分享接口的正常工作前提下,您才能顺利地完成屏幕分享功能的开发。