上一篇介绍了iOS系统屏幕录制的实现方案,接下来我们介绍一下腾讯TRTC SDK的接入方案。
本文介绍的场景是TRTC的会议场景的屏幕分享。直播的实现方式请参考文末的官方文档。
首先在项目里调用SDK的录屏功能,需要设置一些参数,如下:
func startScreenShare() {
if #available(iOS 12.0, *) {
let params = TRTCVideoEncParam()
params.videoResolution = TRTCVideoResolution._1280_720
params.videoFps = 10
params.videoBitrate = 1800
TRTCCloud.sharedInstance()?.startScreenCapture(byReplaykit: params, appGroup: "xxx")
TRTCBroadcastExtensionLauncher.launch()
}
}
需要注意的是截止到SDK的7.9版本,TRTC SDK 不支持分享屏幕和摄像头采集同时推流,所以在分享屏幕之前需要确保本地摄像头采集停止。
另外TRTCBroadcastExtensionLauncher.launch() 是一个比较trick的用法,目前的iOS版本都没问题,但是如果Apple以后改了RPSystemBroadcastPickerView,可能会失效,大家审慎使用。
接下来就是在Extension中实现数据的推流,代码如下:
class SampleHandler: RPBroadcastSampleHandler, TXReplayKitExtDelegate {
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: "xxx", 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()
}
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")
}
}
//MARK: - action
func sendMsgToHostApp(title: String, msg: String, userInfo: [String: Any]) {
}
func startCapture() {
}
func addCFObserver(name: String, callback: @escaping CFNotificationCallback) {
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
nil,
callback,
name as CFString,
nil,
.deliverImmediately)
}
func addAllObserver() {
self.addCFObserver(name: "start") { (center, observer, name, object, info) in
}
self.addCFObserver(name: "pause") { (center, observer, name, object, info) in
}
self.addCFObserver(name: "stop") { (center, observer, name, object, info) in
}
}
//MARK: - TXReplayKitExtDelegate
func broadcastFinished(_ broadcast: TXReplayKitExt, reason: TXReplayKitExtReason) {
var tip = ""
switch reason {
case .requestedByMain:
tip = "屏幕共享已结束"
case .disconnected:
tip = "应用断开"
case .versionMismatch:
tip = "SDK版本不符"
default:
tip = ""
}
let error = NSError(domain: String(describing: self),
code: 0,
userInfo: [NSLocalizedFailureReasonErrorKey: tip])
self.finishBroadcastWithError(error)
}
}
其中进程间通信的一些方法没有实现,在TRTC中不是必须实现。
TXLiteAVSDK_ReplayKitExt是TRTC iOS端的SDK为了配合推流而专门写的一个库TXLiteAVSDK_ReplayKitExt,大家可以直接调用就好。
TXReplayKitExt封装的方法已经把数据处理等功能实现,大家直接调用就好。
另外本文所示的场景是实时音视频的场景,直播模式大家可以参考下面的官网文档,做相应的实现即可。
TRTC官网文档:https://cloud.tencent.com/document/product/647/45750
直播屏幕推流的文档:https://cloud.tencent.com/document/product/454/7883#accessory
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。