产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
iOS | Android | macOS | Windows | Electron | Chrome 浏览器 |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
startScreenCapture 并传入参数appgroup 即可。updateVideoQualityEx修改编码参数,我们推荐的用于 iOS 屏幕分享的编码参数是:参数项 | 参数名称 | 常规推荐值 | 文字教学场景 |
分辨率 | videoResolution | 1280 × 720 | 1920 × 1080 |
帧率 | fps | 10 FPS | 8 FPS |
最高码率 | bitrate | 1600 kbps | 2000 kbps |
import RTCRoomEnginelet roomEngine = TUIRoomEngine.sharedInstance()roomEngine.startScreenCapture(appGroup: "")let params = TUIRoomVideoEncoderParams()params.fps = 10 //替换为您真实需要的值params.resolutionMode = .portrait //竖屏分辨率params.bitrate = .1600 //此处换为您真实需要的值params.videoResolution = .quality720P //此处换位您需要的值roomEngine.updateVideoQualityEx(streamType: .screenStream, params: params)
TXLiteAVSDK_ReplayKitExt.framework。


Target名.entitlements 的文件,如下图所示,选中该文件并单击 + 号填写上述步骤中的 App Group 即可。
import ReplayKitimport TXLiteAVSDK_ReplayKitExtlet APPGROUP = ""class SampleHandler: RPBroadcastSampleHandler, TXReplayKitExtDelegate {let recordScreenKey = Notification.Name.init("TRTCRecordScreenKey")override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {if let setupInfo = setupInfo {}TXReplayKitExt.sharedInstance().setup(withAppGroup: APPGROUP, delegate: self)}override func broadcastPaused() {// 可以添加暂停时的资源释放或状态保存逻辑}override func broadcastResumed() {// 可以添加恢复时的资源重新初始化逻辑}override func broadcastFinished(){// User has requested to finish the broadcast.TXReplayKitExt.sharedInstance().broadcastFinished()}func broadcastFinished(_ broadcast: TXReplayKitExt, reason: TXReplayKitExtReason) {var tip = ""switch reason {case TXReplayKitExtReason.requestedByMain:tip = "屏幕共享已结束"breakcase TXReplayKitExtReason.disconnected:tip = "应用断开"breakcase TXReplayKitExtReason.versionMismatch:tip = "集成错误(SDK 版本号不相符合)"breakdefault: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:TXReplayKitExt.sharedInstance().send(sampleBuffer, with: .video)breakcase RPSampleBufferType.audioApp:// 可以在此处处理应用音频breakcase RPSampleBufferType.audioMic:// 可以在此处处理麦克风音频break@unknown default:let error = "未知的采样缓冲区类型: \\(sampleBufferType)"finishBroadcastWithError(NSError(domain: error, code: -1, userInfo: nil))}}}
startScreenCapture 方法,并传入 步骤1 中设置的 AppGroup,让 SDK 进入“等待”状态。stopScreenCapture 接口可以随时中止屏幕分享。import RTCRoomEngineTUIRoomEngine.sharedInstance().startScreenCapture(appGroup: "")TUIRoomEngine.sharedInstance().stopScreenCapture()
TRTCBroadcastExtensionLauncher 文件实现了唤起屏幕分享,将其加入到您的工程中。TRTCBroadcastExtensionLauncher 中的 launch 函数,就可以唤起屏幕分享功能了。@objc private func buttonTapped() {TRTCBroadcastExtensionLauncher.sharedInstance.launch()}
import UIKitimport TXLiteAVSDK_ReplayKitExtclass TRTCBroadcastExtensionLauncher: NSObject {var systemBroacastExtensionPicker = RPSystemBroadcastPickerView()var prevLaunchEventTime : CFTimeInterval = 0static let sharedInstance = TRTCBroadcastExtensionLauncher()override init() {super.init()let picker = RPSystemBroadcastPickerView(frame: CGRect(x: 0, y: 0, width: 44, height: 44))picker.showsMicrophoneButton = falsepicker.autoresizingMask = [.flexibleTopMargin, .flexibleRightMargin]systemBroacastExtensionPicker = pickerif let pluginPath = Bundle.main.builtInPlugInsPath,let contents = try? FileManager.default.contentsOfDirectory(atPath: pluginPath) {for content in contents where content.hasSuffix(".appex") {guard let bundle = Bundle(path: URL(fileURLWithPath: pluginPath).appendingPathComponent(content).path),let identifier : String = (bundle.infoDictionary?["NSExtension"] as? [String:Any])? ["NSExtensionPointIdentifier"] as? Stringelse {continue}if identifier == "com.apple.broadcast-services-upload" {picker.preferredExtension = bundle.bundleIdentifierbreak}}}}static func launch() {TRTCBroadcastExtensionLauncher.sharedInstance.launch()}func launch() {// The pop-up on iOS 12 is slow and will crash if you click quickly.let now = CFAbsoluteTimeGetCurrent()if now - prevLaunchEventTime < 1.0 {return}prevLaunchEventTime = nowfor view in systemBroacastExtensionPicker.subviews {if let button = view as? UIButton {button.sendActions(for: .allTouchEvents)break}}}}
RPSystemBroadcastPickerView 可以从应用中弹出启动器供用户确认启动屏幕分享,到目前为止, RPSystemBroadcastPickerView 尚不支持自定义界面,也没有官方的唤起方法。RPSystemBroadcastPickerView 的子 View 寻找 UIButton 并触发了其点击事件。import RTCRoomEnginelet roomEngine = TUIRoomEngine.sharedInstance()let layoutManager = roomEngine.getExtension(extensionType: .liveLayoutManager) as? TUILiveLayoutManagerroomEngine.startScreenCapture(appGroup: "")//替换为真实的appGrouplayoutManager.setLiveStreamLayoutInfo(roomID: roomInfo.roomId,layoutInfo: "" //详见下文onSuccess: {//修改成功},onError: {code ,message in})//layoutInfo格式需求:{"RoomId": "live_adams", //替换为您的RoomID//当layouttype是1000时候,修改VideoEncode时候需要同步修改LayoutInfo,九宫格模式下会默认自动根据分辨率修改更新layoutInfo"VideoEncode": {"Width": 1080,"Height": 1920,},"LayoutMode": 1000, // 0~9 内置布局模板, 1000自定义布局, 只有1000时候才能修改LayoutInfo,0为九宫格"LayoutInfo":{"LayoutList": [{"LocationX": 0, // 具体数值"LocationY": 0, // 具体数值"ImageWidth": 1080, // 具体数值"ImageHeight": 960, // 具体数值"ZOrder": 0, // 层级"StreamType": 0, // 0为摄像头, 1为屏幕共享"Member_Account": "admin001", //替换为您的userId"BackgroundImageUrl": "ImageUrl","RoomId":"live_adams", //替换为您的RoomId"BackgroundColor":"0x1F212C"},{"LocationX": 0, // 具体数值"LocationY": 960, // 具体数值"ImageWidth": 1080, // 具体数值"ImageHeight": 960, // 具体数值"ZOrder": 0, // 层级"StreamType": 0, // 0为摄像头, 1为屏幕共享"Member_Account": "admin001", //替换为您的UserId"BackgroundImageUrl": "ImageUrl","RoomId":"live_adams", //替换为您的RoomId"BackgroundColor":"0x1F212C"}],"MaxUserLayout": {"LocationX": 0, // 具体数值"LocationY": 0, // 具体数值"ImageWidth": 1080, // 具体数值"ImageHeight": 1920, // 具体数值"ZOrder": 0, //层级"StreamType": 0, // 0为摄像头, 1为屏幕共享"Member_Account": "admin001", //替换为您的userId"BackgroundImageUrl": "ImageUrl","RoomId":"live_adams", //替换为您的roomId"BackgroundColor":"0x1F212C"}}
import RTCRoomEnginelet roomEngine = TUIRoomEngine.sharedInstance()let layoutManager = roomEngine.getExtension(extensionType: .liveLayoutManager) as? TUILiveLayoutManagerroomEngine.stopScreenCapture()layoutManager.setLiveStreamLayoutInfo(roomID: roomInfo.roomId,layoutInfo: "",//详见下文onSuccess: {},onError: { code ,message in})//当您想要恢复默认的宫格布局时,您需要传入的layoutInfo参数如下:{"RoomId": "live_12121", //替换为真实房间号"VideoEncode": {"Width": 1080,"Height": 1920},"LayoutMode": 0}
import RTCRoomEngineextension ScreenSharedController: TUIRoomObserver { //替换为您具体的业务类,此处仅为举例func onUserVideoStateChanged(userId: String, streamType: TUIVideoStreamType, hasVideo: Bool, reason: TUIChangeReason) {}}
文档反馈