屏幕共享
更新时间: 2024/03/15 17:14:52
在大型会议或在线教育等场景中,为了满足提升沟通效率的需求,主讲人或老师需要将本端的屏幕内容分享给远端参会者或在线学生观看。NERTC 支持屏幕共享功能,帮助您实时分享本端设备的屏幕内容。
功能介绍
通过 NERTC SDK 可以在视频通话或互动直播过程中实现屏幕共享,主播或连麦者可以将自己的屏幕内容,以视频的方式分享给远端参会者或在线观众观看,从而提升沟通效率,一般适用于多人视频聊天、在线会议以及在线教育场景。
-
视频会议场景中,参会者可以在会议中将本地的文件、数据、网页、PPT 等画面分享给其他与会者,让其他与会者更加直观的了解讨论的内容和主题。
-
在线课堂场景中,老师可以通过屏幕共享将课件、笔记、教学内容等画面展示给远端的其他学生观看,降低传统教学模式下的沟通成本,提升教育场景的用户体验。
NERTC SDK 以辅流的形式实现屏幕共享,即单独为屏幕共享开启一路上行的视频流,摄像头的视频流作为主流,屏幕共享的视频流作为辅流,两路视频流并行,主播同时上行摄像头画面和屏幕画面两路画面。
注意事项
- Android端 MediaProjection 等 API 需要 Android API level 21+,使用方法请参考 Google MediaProjection API 文档。
- 当前的uni-app在iOS端还不支持屏幕共享功能,仅安卓端支持
- 如果遇到不生效的问题,可以将manifest.json配置文件中的 'targetSdkVersion' 降低至 28
本端共享屏幕
实现方法
步骤一 开启屏幕共享
在加入房间之后调用 startScreenCapture
方法开启屏幕共享,以辅流形式发送屏幕共享内容。
调用此方法时,您需要设置 screenConfigParam
配置本地辅流的编码参数。
参数说明如下表所示。
参数 | 参数说明 |
---|---|
contentPrefer |
屏幕共享编码策略倾向:
|
maxProfile | 视频编码的分辨率。 具体请参考 NERtcVideoProfileType。 |
frameRate | 视频编码的帧率。 可以设置为 0、7(默认)、10、15、24、30 fps,具体请参考 NERtcVideoFrameRate。 |
minFramerate | 视频编码的最小帧率。 默认值为 0,表示使用默认的最小帧率。 |
bitrate | 视频编码的码率,单位为 Kbps。 若设置的码率为 0 或超出合理范围,SDK 会自行计算出合理区间处理码率,具体请参考分辨率、帧率、码率参照表。 |
minBitrate | 视频编码的最小码率,单位为 Kbps。 |
典型场景参数配置推荐
以下表格列出了针对一些典型场景的屏幕共享参数的推荐值,供您参考。
参数名称 | 常规推荐值 | 一起看视频 | 共享 PPT |
---|---|---|---|
contentPrefer | CONTENT_PREFER_MOTION | CONTENT_PREFER_MOTION | CONTENT_PREFER_DETAILS |
videoProfile | HD720P | HD720P | HD1080p |
frameRate | FRAME_RATE_FPS_7 | FRAME_RATE_FPS_30 | FRAME_RATE_FPS_7 |
bitrate | 0(默认值) | 0(默认值) | 0(默认值) |
- 若屏幕共享的内容为静态画面,设置较高的帧率并不经济,推荐 7 fps 即可。
- 若用户要共享的屏幕内容包含大量文字,可以适当提高分辨率和码率设置。
示例代码如下:
javaScriptlet screenConfigParam = {
maxProfile: NERtcVideoProfileType.Standard,
frameRate: NERtcVideoFrameRate.FRAME_RATE_FPS_24, //设置帧率24
minFrameRate: NERtcVideoFrameRate.FRAME_RATE_FPS_15, //设置最小帧率15
bitrate: 2500, //设置屏幕共享码率2500kbps
minBitrate: 1500, //设置屏幕共享码率最小为1500kbps
contentPrefer: NERtcSubStreamContentPrefer.CONTENT_PREFER_DETAILS, //屏幕共享功能的编码策略倾向
};
this.engine.startScreenCapture(screenConfigParam)
步骤三 设置本端辅流画布
调用 setupLocalSubStreamVideoCanvas
方法设置本端的辅流视频画布。
调用此接口时,您需要设置 render
参数配置视频画布。
您可以在开启屏幕共享前后随时设置本端辅流画布。
示例代码如下:
javaScriptthis.engine.setupLocalSubStreamVideoCanvas({
renderMode: NERTCRenderMode.Fit, // Fit表示应区域。视频尺寸等比缩放,保证所有区域被填满,视频超出部分会被裁剪
mirrorMode: NERTCMirrorMode.AUTO, //AUTO表示使用默认值,由sdk控制
isMediaOverlay: false //表示小画布置于大画布上面
})
步骤四 停止屏幕共享
若您要结束屏幕共享,请调用 stopScreenCapture
方法关闭辅流形式的屏幕共享。
示例代码如下:
javaScriptthis.engine.stopScreenCapture();
观看远端屏幕共享
API 调用时序
sequenceDiagram
participant 应用层
participant NERtcSDK
NERtcSDK-->>应用层: onUserSubStreamVideoStart 远端用户开启屏幕共享的回调
应用层->>NERtcSDK: setupRemoteSubStreamVideoCanvas 设置远端的辅流视频回放画布
应用层->>NERtcSDK: subscribeRemoteSubStreamVideo 订阅远端的屏幕共享辅流视频
NERtcSDK-->>应用层: onUserSubStreamVideoStop 远端用户关闭辅流的回调
实现方法
- 远端用户加入房间。
- 收到
onUserSubStreamVideoStart
其他用户开启屏幕共享辅流通道的回调。 - 通过
setupRemoteSubStreamVideoCanvas
设置远端的辅流视频回放画布。 - 通过
subscribeRemoteSubStreamVideo
订阅远端的屏幕共享辅流视频,订阅之后才能接收远端的辅流视频数据。 - 收到
onUserSubStreamVideoStop
其他用户关闭辅流的回调,结束屏幕共享。
示例代码
this.engine.addEventListener("onUserSubStreamVideoStart", (userID, maxProfile) => {
const message = `onUserSubStreamVideoStart通知:对方开启屏幕共享,userID = ${userID}, maxProfile = ${maxProfile}`
//设置对端的视频辅流画布
this.engine.setupRemoteSubStreamVideoCanvas({
renderMode: NERTCRenderMode.Fit, // Fit表示应区域。视频尺寸等比缩放,保证所有区域被填满,视频超出部分会被裁剪
mirrorMode: NERTCMirrorMode.AUTO, //AUTO表示使用默认值,由sdk控制
isMediaOverlay: false, //表示小画布置于大画布上面
userID: userID //对方userID
})
//主动去订阅对端视频辅流
this.engine.subscribeRemoteSubStreamVideo({
userID: userID,
streamType:NERtcRemoteVideoStreamType.HIGH, //HIGH: 大流, LOW: 小流
subscribe: true //true表示订阅,false表示取消订阅
})
});
API 参考
方法 | 功能描述 |
---|---|
startScreenCapture |
开启屏幕共享。 |
setupLocalSubStreamVideoCanvas |
设置本端的辅流视频画布。 |
stopScreenCapture |
关闭屏幕共享。 |
setupRemoteSubStreamVideoCanvas |
设置远端的辅流视频回放画布。 |
onUserSubStreamVideoStart |
通知本端关于远端用户开启屏幕共享辅流通道的回调。 |
subscribeRemoteSubStreamVideo |
订阅远端的屏幕共享辅流视频 |
onUserSubStreamVideoStop |
通知本端关于远端用户关闭屏幕共享辅流通道的回调。 |