本文档主要介绍如何使用屏幕分享,目前一个 TRTC 音视频房间只能有一路屏幕分享。
鸿蒙平台下的屏幕分享支持主路分享和辅路分享两种方案:
辅路分享
在 TRTC 中,我们可以单独为屏幕分享开启一路上行的视频流,并称之为辅路(substream)。辅路分享即主播同时上行摄像头画面和屏幕画面两路视频流。这是腾讯会议的使用方案,您可以在调用
startScreenCapture 接口,通过将 TRTCVideoStreamType 参数指定为 TRTCVideoStreamTypeSub 来启用该模式。主路分享
在 TRTC 中,我们一般把摄像头走的通道叫做主路(bigstream),主路分享即用摄像头通道分享屏幕。该模式下,主播只有一路上行视频流,要么上行摄像头画面,要么上行屏幕画面,两者是互斥的。您可以在调用
startScreenCapture 接口时,通过将 TRTCVideoStreamType 参数指定为 TRTCVideoStreamTypeBig 来启用该模式。API 功能列表
API 功能 | HarmonyOS |
开始屏幕分享 | |
暂停屏幕分享 | |
恢复屏幕分享 | |
结束屏幕分享 | |
设置辅路编码参数 |
开始屏幕分享
使用
startScreenCapture 接口可以启动屏幕分享。该接口支持抓取整个鸿蒙系统的屏幕,可以实现类似腾讯会议的全系统级的屏幕分享。说明:
鸿蒙平台的屏幕分享是系统级的全屏采集,不支持选择特定窗口进行分享,因此无需像 Windows 平台那样调用
getScreenCaptureSources 获取分享目标或调用 selectScreenCaptureTarget 选择分享目标。推荐的屏幕分享视频编码参数(
TRTCVideoEncParam):分辨率(videoResolution):1280×720。
帧率(videoFps):10 FPS。
码率(videoBitrate):1200 kbps。
分辨率自适应(enableAdjustRes):false。
// 示例代码:启动屏幕分享(辅路)import { TRTCCloud, TRTCVideoStreamType, TRTCVideoEncParam, TRTCVideoResolution, TRTCVideoResolutionMode } from 'liteavsdk';// 创建 TRTCCloud 实例let trtcCloud = TRTCCloud.create();// 设置屏幕分享编码参数let encParam = new TRTCVideoEncParam();encParam.videoResolution = TRTCVideoResolution.TRTCVideoResolution_1280_720;encParam.videoFps = 10;encParam.videoBitrate = 1200;encParam.videoResolutionMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape;// 启动屏幕分享(辅路)trtcCloud.startScreenCapture(TRTCVideoStreamType.TRTCVideoStreamTypeSub, encParam);
设定画面质量
您可以通过
setSubStreamEncoderParam 接口设定屏幕分享的画面质量,包括分辨率、码率和帧率,我们提供如下建议参考值:清晰度级别 | 分辨率 | 帧率 | 码率 |
超高清(HD+) | 1920 × 1080 | 10 | 2000kbps |
高清(HD) | 1280 × 720 | 10 | 1200kbps |
标清(SD) | 960 × 720 | 10 | 1000kbps |
// 示例代码:设置辅路编码参数let subStreamParam = new TRTCVideoEncParam();subStreamParam.videoResolution = TRTCVideoResolution.TRTCVideoResolution_1280_720;subStreamParam.videoFps = 10;subStreamParam.videoBitrate = 1200;subStreamParam.videoResolutionMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape;trtcCloud.setSubStreamEncoderParam(subStreamParam);
观看屏幕分享
当房间里有一个用户启动了屏幕分享,会通过辅路传输。房间里的其他用户会通过 TRTCCloudCallback 中的
onUserSubStreamAvailable 事件获得这个通知。希望观看屏幕分享的用户可以通过
startRemoteView 接口来启动渲染远端用户辅路画面。// 示例代码:观看屏幕分享的画面trtcCloud.on('onUserSubStreamAvailable', (userId: string, available: number) => {if (available) {// 订阅远端用户的辅路画面(屏幕分享),view 为 XComponent 的 IDtrtcCloud.startRemoteView(userId, TRTCVideoStreamType.TRTCVideoStreamTypeSub, view);} else {trtcCloud.stopRemoteView(userId, TRTCVideoStreamType.TRTCVideoStreamTypeSub);}});
暂停/停止屏幕分享
在屏幕分享过程中,您可以通过
pauseScreenCapture、resumeScreenCapture 和 stopScreenCapture 接口来控制屏幕分享的状态。pauseScreenCapture 和 stopScreenCapture 的区别在于:暂停 :调用
pauseScreenCapture 会停止屏幕内容的采集,并以暂停那一刻的画面按照 1 fps 帧率输出,所以在远端看到的一直是最后一帧画面,直到调用 resumeScreenCapture 恢复屏幕共享。适用于临时中断分享的场景,例如用户需要短暂处理隐私内容。停止 :调用
stopScreenCapture 会完全终止屏幕分享,辅路视频流将被关闭,远端用户会收到 onUserSubStreamAvailable(userId, false) 的回调通知。// 示例代码:暂停/恢复/停止屏幕分享import { TRTCCloud } from 'liteavsdk';let trtcCloud = TRTCCloud.create();// 暂停屏幕分享(远端将看到最后一帧画面)trtcCloud.pauseScreenCapture();// 恢复屏幕分享trtcCloud.resumeScreenCapture();// 停止屏幕分享(完全终止,远端将收到 onUserSubStreamAvailable 回调)trtcCloud.stopScreenCapture();
屏幕分享事件回调
SDK 提供了屏幕分享相关的事件回调,您可以通过监听这些回调来获取屏幕分享的状态变化:
// 屏幕分享开启的事件回调trtcCloud.on('onScreenCaptureStarted', () => {console.log('屏幕分享已开启');});// 屏幕分享暂停的事件回调trtcCloud.on('onScreenCapturePaused', (reason: number) => {console.log('屏幕分享已暂停,原因:' + reason);});// 屏幕分享恢复的事件回调trtcCloud.on('onScreenCaptureResumed', (reason: number) => {console.log('屏幕分享已恢复,原因:' + reason);});// 屏幕分享停止的事件回调trtcCloud.on('onScreenCaptureStoped', (reason: number) => {// reason: 0-用户主动停止console.log('屏幕分享已停止,原因:' + reason);});
常见问题解答
一个房间里可以同时有多路屏幕分享吗?
目前一个 TRTC 音视频房间只能有一路屏幕分享。
鸿蒙平台的屏幕分享支持选择特定窗口吗?
鸿蒙平台的屏幕分享是系统级的全屏采集,不支持选择特定窗口进行分享。如需分享特定内容,建议使用自定义采集方案。
屏幕分享时如何设置编码参数?
您可以在调用
startScreenCapture 时通过 encParams 参数指定编码参数,也可以在分享过程中通过 setSubStreamEncoderParam 接口动态调整辅路的编码参数。如果在 startScreenCapture 时将 encParams 指定为 null,SDK 会自动使用之前设定的编码参数。