前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TRTC iOS 屏幕分享功能实践(二)

TRTC iOS 屏幕分享功能实践(二)

原创
作者头像
GF
发布2020-11-06 20:24:40
1.8K0
发布2020-11-06 20:24:40
举报
文章被收录于专栏:腾讯云终端专家服务

二、TRTC 屏幕分享实现

上一篇介绍了iOS系统屏幕录制的实现方案,接下来我们介绍一下腾讯TRTC SDK的接入方案。

本文介绍的场景是TRTC的会议场景的屏幕分享。直播的实现方式请参考文末的官方文档。

首先在项目里调用SDK的录屏功能,需要设置一些参数,如下:

代码语言:javascript
复制
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中实现数据的推流,代码如下:

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、TRTC 屏幕分享实现
相关产品与服务
实时音视频
实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档