腾讯云 TRTC 在 Android 系统上支持屏幕分享,即将当前系统的屏幕内容通过 TRTC SDK 分享给房间里的其他用户。关于此功能,有两点需要注意:
要开启 Android 端的屏幕分享,只需调用 TRTCCloud
中的 startScreenCapture() 接口即可。但如果要达到稳定和清晰的分享效果,您需要关注如下三个问题:
在 manifest 文件中粘贴如下 activity(若项目代码中存在则不需要添加)。
<activity
android:name="com.tencent.rtmp.video.TXScreenCapture$TXScreenCaptureAssistantActivity"
android:theme="@android:style/Theme.Translucent"/>
通过设置 startScreenCapture() 中的首个参数 encParams
,您可以指定屏幕分享的编码质量。如果您指定 encParams
为 null,SDK 会自动使用之前设定的编码参数,我们推荐的参数设定如下:
参数项 | 参数名称 | 常规推荐值 | 文字教学场景 |
---|---|---|---|
分辨率 | videoResolution | 1280 × 720 | 1920 × 1080 |
帧率 | videoFps | 10 FPS | 8 FPS |
最高码率 | videoBitrate | 1600 kbps | 2000 kbps |
分辨率自适应 | enableAdjustRes | NO | NO |
说明:
- 由于屏幕分享的内容一般不会剧烈变动,所以设置较高的 FPS 并不经济,推荐10 FPS即可。
- 如果您要分享的屏幕内容包含大量文字,可以适当提高分辨率和码率设置。
- 最高码率(videoBitrate)是指画面在剧烈变化时的最高输出码率,如果屏幕内容变化较少,实际编码码率会比较低。
应用内分享的方案非常简单,只需要调用 TRTC SDK 提供的接口 startScreenCapture 并传入编码参数TRTCVideoEncParam
和 参数appGroup
设置为''
。TRTCVideoEncParam
参数可以设置为 null,此时 SDK 会沿用开始屏幕分享之前的编码参数。
我们推荐的用于 iOS 屏幕分享的编码参数是:
参数项 | 参数名称 | 常规推荐值 | 文字教学场景 |
---|---|---|---|
分辨率 | videoResolution | 1280 × 720 | 1920 × 1080 |
帧率 | videoFps | 10 FPS | 8 FPS |
最高码率 | videoBitrate | 1600 kbps | 2000 kbps |
分辨率自适应 | enableAdjustRes | NO | NO |
说明:
- 由于屏幕分享的内容一般不会剧烈变动,所以设置较高的 FPS 并不经济,推荐10 FPS即可。
- 如果您要分享的屏幕内容包含大量文字,可以适当提高分辨率和码率设置。
- 最高码率(videoBitrate)是指画面在剧烈变化时的最高输出码率,如果屏幕内容变化较少,实际编码码率会比较低。
我们在 Github 中的 trtc_demo/ios 目录下放置了一份跨应用分享的示例代码,其包含如下一些文件:
├── Broadcast.Upload //录屏进程 Broadcast Upload Extension 代码详见步骤2
│ ├── Broadcast.Upload.entitlements //用于设置进程间通信的 AppGroup 信息
│ ├── Broadcast.UploadDebug.entitlements //用于设置进程间通信的 AppGroup 信息(debug环境)
│ ├── Info.plist
│ └── SampleHandler.swift // 用于接收来自系统的录屏数据
├── Resource // 资源文件
├── Runner // TRTC 精简化 Demo
├── TXLiteAVSDK_ReplayKitExt.framework //TXLiteAVSDK_ReplayKitExt SDK
您可以通过 README 中的指引跑通该示例 Demo。
iOS 系统上的跨应用屏幕分享,需要增加 Extension 录屏进程以配合主 App 进程进行推流。Extension 录屏进程由系统在需要录屏的时候创建,并负责接收系统采集到屏幕图像。因此需要:
TXLiteAVSDK_ReplayKitExt.framework
。pubspec.yaml
文件引入 replay_kit_launcher
插件 ,实现类似TRTC Demo Screen中点击一个按钮即可唤起屏幕分享的效果(可选)。# 引入 trtc sdk和replay_kit_launcher
dependencies:
tencent_trtc_cloud: ^0.2.1
replay_kit_launcher: ^0.2.0+1
注意:如果跳过 步骤1,也就是不配置 App Group(接口传 null),屏幕分享依然可以运行,但稳定性要打折扣,故虽然步骤较多,但请尽量配置正确的 App Group 以保障屏幕分享功能的稳定性。
使用您的帐号登录 https://developer.apple.com/,进行以下操作,注意完成后需要重新下载对应的 Provisioning Profile。
Target名.entitlements
的文件,如下图所示,选中该文件并单击 + 号填写上述步骤中的 App Group 即可。import ReplayKit
import TXLiteAVSDK_ReplayKitExt
let APPGROUP = "group.com.tencent.comm.trtc.demo"
class SampleHandler: RPBroadcastSampleHandler, TXReplayKitExtDelegate {
let recordScreenKey = Notification.Name.init("TRTCRecordScreenKey")
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
TXReplayKitExt.sharedInstance().setup(withAppGroup: APPGROUP, delegate: self)
}
override func broadcastPaused() {
// User has requested to pause the broadcast. Samples will stop being delivered.
}
override func broadcastResumed() {
// User has requested to resume the broadcast. Samples delivery will resume.
}
override func broadcastFinished() {
// User has requested to finish the broadcast.
TXReplayKitExt.sharedInstance() .finishBroadcast()
}
func broadcastFinished(_ broadcast: TXReplayKitExt, reason: TXReplayKitExtReason) {
var tip = ""
switch reason {
case TXReplayKitExtReason.requestedByMain:
tip = "屏幕共享已结束"
break
case TXReplayKitExtReason.disconnected:
tip = "应用断开"
break
case TXReplayKitExtReason.versionMismatch:
tip = "集成错误(SDK 版本号不相符合)"
break
default:
break
}
let error = NSError(domain: NSStringFromClass(self.classForCoder), code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:tip])
finishBroadcastWithError(error)
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// Handle video sample buffer
TXReplayKitExt.sharedInstance() .sendVideoSampleBuffer(sampleBuffer)
break
case RPSampleBufferType.audioApp:
// Handle audio sample buffer for app audio
break
case RPSampleBufferType.audioMic:
// Handle audio sample buffer for mic audio
break
@unknown default:
// Handle other sample buffer types
fatalError("Unknown type of sample buffer")
}
}
}
按照如下步骤,对接主 App 端的接收逻辑。也就是在用户触发屏幕分享之前,要让主 App 处于“等待”状态,以便随时接收来自 Broadcast Upload Extension 进程的录屏数据。
// 开始屏幕分享,需要将 APPGROUP 替换为上述步骤中创建的 App Group
trtcCloud.startScreenCapture(
TRTCVideoEncParam(
videoFps: 10,
videoResolution: TRTCCloudDef.TRTC_VIDEO_RESOLUTION_1280_720,
videoBitrate: 1600,
videoResolutionMode: TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT,
),
iosAppGroup,
);
// 停止屏幕分享
await trtcCloud.stopScreenCapture();
// 屏幕分享的启动事件通知,可以通过 TRTCCloudListener 进行接收
onRtcListener(type, param){
if (type == TRTCCloudListener.onScreenCaptureStarted) {
//屏幕分享开始
}
}
截止到 步骤3,我们的屏幕分享还必须要用户从控制中心中长按录屏按钮来手动启动。您可通过下述方法实现类似 TRTC Demo Screen 的单击按钮即可触发的效果。
replay_kit_launcher
插件加入到您的工程中。ReplayKitLauncher.launchReplayKitBroadcast(iosExtensionName);
函数,就可以唤起屏幕分享功能了。// 自定义按钮响应方法
onShareClick() async {
if (Platform.isAndroid) {
if (await SystemAlertWindow.requestPermissions) {
MeetingTool.showOverlayWindow();
}
} else {
//屏幕分享功能只能在真机测试
ReplayKitLauncher.launchReplayKitBroadcast(iosExtensionName);
}
}
一个房间里可以同时有多路屏幕分享吗?
目前一个 TRTC 音视频房间只能有一路屏幕分享。
本页内容是否解决了您的问题?