屏幕共享
更新时间: 2024/08/05 15:02:55
在大型会议或在线教育等场景中,为了满足提升沟通效率的需求,主讲人或老师需要将本端的屏幕内容分享给远端参会者或在线学生观看。NERTC 支持屏幕共享功能,帮助您实时分享本端设备的屏幕内容。
功能介绍
通过 NERTC SDK 可以在视频通话或互动直播过程中实现屏幕共享,主播或连麦者可以将自己的屏幕内容,以视频的方式分享给远端参会者或在线观众观看,从而提升沟通效率,一般适用于多人视频聊天、在线会议以及在线教育场景。
-
视频会议场景中,参会者可以在会议中将本地的文件、数据、网页、PPT 等画面分享给其他与会者,让其他与会者更加直观的了解讨论的内容和主题。
-
在线课堂场景中,老师可以通过屏幕共享将课件、笔记、教学内容等画面展示给远端的其他学生观看,降低传统教学模式下的沟通成本,提升教育场景的用户体验。
NERTC SDK 以辅流的形式实现屏幕共享,即单独为屏幕共享开启一路上行的视频流,摄像头的视频流作为主流,屏幕共享的视频流作为辅流,两路视频流并行,主播同时上行摄像头画面和屏幕画面两路画面。
注意事项
- NERTC Android、iOS、Windows 和 macOS SDK V3.9.0 及以上版本,Web SDK V4.1.0 及以上版本支持通过辅流实现屏幕共享。如果使用辅流的屏幕共享方案,请保证房间内所有成员均升级到支持版本以上,否则互相通信时会因同时发送主流和辅流造成通话异常等问题。
- 如果您的 App 无法针对所有端进行强制升级,屏幕共享场景中仅部分端使用 V3.9.0 及以上版本,为避免上述通话异常问题,必须保证通话过程中单人同时只有一路上行视频流。当需要将视频流切换为屏幕共享流时,请先通过
enableLocalVideo
关闭视频流,再通过startScreenCapture
启动屏幕共享流。反向切换同理。 - 在开始屏幕共享前,请确保已在您的项目中实现基本的实时音视频功能。
- MediaProjection 等 API 需要 Android API level 21+,使用方法请参考 Google MediaProjection API 文档。
- Android 10 及以后的版本屏幕共享系统要求开启一个前台服务,因此需要在
AndroidManifest.xml
中添加 service,同时将 compileSdkVersion 设置为 29。请根据您的业务需求添加 service。
本端共享屏幕
API 调用时序
开发 Android 系统的应用时,您需要使用 Android 原生 API 和 NERTC API 共同实现屏幕共享功能。API 调用时序如下图所示。
配置步骤
- 添加 ScreenShareService,具体请参考 Demo。
- 通过
MediaProjection
创建ScreenCaptureIntent
请求屏幕共享权限,并将 intent 传递给startActivityForResult()
。 - 在加入房间之后调用
startScreenCapture
方法开启屏幕共享,以辅流形式发送屏幕共享内容。调用此方法时,您需要设置screenConfig
配置本地辅流的编码参数,传入请求权限后返回的 intent data,并设置MediaProjection.Callback()
以接收屏幕共享状态回调。 - 调用
setupLocalSubStreamVideoCanvas
方法设置本端的辅流视频画布。调用此接口时,您需要设置render
参数配置视频画布。 - 若您要结束屏幕共享,调用
stopScreenCapture
方法关闭辅流形式的屏幕共享。
示例代码
java//先请求屏幕共享权限
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void startScreenCapture() {
MediaProjectionManager mediaProjectionManager =
(MediaProjectionManager) getApplication().getSystemService(
Context.MEDIA_PROJECTION_SERVICE);
startActivityForResult(
mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
}
//在权限请求返回中打开屏幕共享接口
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE)
return;
if(resultCode != Activity.RESULT_OK) {
showToast("你拒绝了录屏请求!");
getUiKitButtons().find("screen_cast", Boolean.class).setState(false);
return;
}
NERtcScreenConfig screenProfile = new NERtcScreenConfig();
screenProfile.videoProfile = mScreenProfile;
screenProfile.contentPrefer = mScreenContent;
screenProfile.frameRate = mScreenFps;
screenProfile.minFramerate = mScreenMinFps;
screenProfile.bitrate = mScreenEncodeBitrate;
screenProfile.minBitrate = mScreenEncodeMinBitrate;
mScreenService.startScreenCapture(screenProfile, data, new MediaProjection.Callback() {
@Override
public void onStop() {
super.onStop();
showToast("录屏已停止");
}
});
NERtcEx.getInstance().setupLocalSubStreamVideoCanvas(mScreenView);
}
// 停止桌面共享
NERtcEx.getInstance().stopScreenCapture();
观看远端屏幕共享
API 调用时序
配置步骤
- 远端用户加入房间。
- 收到
onUserSubStreamVideoStart
其他用户开启屏幕共享辅流通道的回调。 - 通过
setupRemoteSubStreamVideoCanvas
设置远端的辅流视频回放画布。 - 通过
subscribeRemoteSubStreamVideo
订阅远端的屏幕共享辅流视频,订阅之后才能接收远端的辅流视频数据。 - 收到
onUserSubStreamVideoStop
其他用户关闭辅流的回调,结束屏幕共享。
示例代码
public void onUserSubStreamVideoStart(long uid,int maxProfile) {
Log.i(TAG, "onUserSubStreamVideoStart uid: " + uid);
NERtcEx.getInstance().subscribeRemoteSubStreamVideo(
user.userId, true);
NERtcEx.getInstance().setupRemoteSubStreamVideoCanvas(view, uid);
}
API 参考
方法 | 功能描述 |
---|---|
startScreenCapture |
开启屏幕共享。 |
setupLocalSubStreamVideoCanvas |
设置本端的辅流视频画布。 |
stopScreenCapture |
关闭屏幕共享。 |
setupRemoteSubStreamVideoCanvas |
设置远端的辅流视频回放画布。 |
onUserSubStreamVideoStart |
通知本端关于远端用户开启屏幕共享辅流通道的回调。 |
subscribeRemoteSubStreamVideo |
订阅远端的屏幕共享辅流视频 |
onUserSubStreamVideoStop |
通知本端关于远端用户关闭屏幕共享辅流通道的回调。 |
此文档是否对你有帮助?