腾讯直播SDK接入及封装(一)之录屏直播(推拉流)
1.省略集成SDK环节,具体的集成以官方为主,这里只是快速接入的参考;
2.获取系统相机、麦克风、屏幕录制等的权限,这里以麦克风为例:
1 2 3 4 5 6 7 8 9 10 11 12 | func checkMicroPermission () - > Bool { let authStatus = AVCaptureDevice . authorizationStatus ( for : . audio ) switch ( authStatus ) { case . authorized : //授权 return true case . notDetermined , . restricted , . denied : return false default : return false } } |
根据用户设置询问是否授权
1 2 3 4 5 6 7 8 | if ! checkMicroPermission () { AVCaptureDevice . requestAccess ( for : . audio ) { granted in if granted { DispatchQueue . main . async { //授权成功后进行后续操作 } } }< br >} |
3.直播封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 1 .创建一个单例保持直播一直在运作 class LiveManager : NSObject { static let shared = LiveManager () //防止外界init private override init () { } } 2 .创建直播推流及直播拉流 private var livePusher : V2TXLivePusher ? private var livePlayer : V2TXLivePlayer = { let txPlayer = V2TXLivePlayer () return txPlayer }() 3 .开启录屏直播(注:在此之前从后端拿到推流地址, pushUrl :推流地址) func startRecord ( _ pushUrl : String ) { if self . livePusher != nil { self . livePusher ?. stopScreenCapture () self . livePusher ?. stopPush () } //开启录屏 TRTCBroadcastExtensionLauncher . launch () //推流,liveMode选择RTC,因为后面要接入连麦功能的时候只能用这个,如果选RTMP连麦混流会有问题 let pusher = V2TXLivePusher ( liveMode : . RTC ) //注册观察者 pusher ?. setObserver ( self ) self . livePusher = pusher //这里可以根据文档来填 pusher ?. startScreenCapture ( "xx.xx.xx" ) pusher ?. startMicrophone () let videoParam = V2TXLiveVideoEncoderParam () //这个resolution640x360根据自己的情况来,并不是越高越好 videoParam . videoResolution = . resolution640x360 //横竖屏模式,我们这边是录制游戏横屏,根据自己的情况设置 videoParam . videoResolutionMode = . landscape pusher ?. setVideoQuality ( videoParam ) pusher ?. setAudioQuality (. default ) let code = pusher ?. startPush ( pushUrl ) if code != V2TXLiveCode . TXLIVE_OK { //这里是失败的情况 pusher ?. stopMicrophone () pusher ?. stopScreenCapture () } } |
然后是关闭直播
1 2 3 4 5 6 | func stopRecord () { if self . livePusher != nil { self . livePusher ?. stopScreenCapture () self . livePusher ?. stopPush () } } |
然后是客户端进行拉流操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | //拉流 public func anchorStartPlayer ( playURL : String , streamId : String , mainstreamId : String , mainUserId : String , userId : String ) { // 不接入连麦功能的话直接指定view就可以了 // self.livePlayer.setRenderView(renderView) self . livePlayer . startLivePlay ( playURL ) let config = V2TXLiveTranscodingConfig () config . videoWidth = 720 config . videoHeight = 1280 config . videoBitrate = 1500 config . videoFramerate = 20 config . videoGOP = 2 config . audioSampleRate = 48000 config . audioBitrate = 64 config . audioChannels = 1 config . outputStreamId = nil let mainStream = V2TXLiveMixStream () mainStream . streamId = mainstreamId mainStream . userId = mainUserId mainStream . height = 1280 mainStream . width = 720 mainStream . x = 0 mainStream . y = 0 mainStream . zOrder = 1 mainStream . inputType = . audioVideo let subStream = V2TXLiveMixStream () subStream . streamId = streamId subStream . userId = userId subStream . height = 1 subStream . width = 1 subStream . x = 0 subStream . y = 0 subStream . zOrder = 1 subStream . inputType = . pureAudio config . mixStreams = [ mainStream , subStream ] let state = self . livePusher ?. setMix ( config ) if state == . TXLIVE_OK { print ( "混流成功" ) } else { print ( "混流失败" ) } } |
然后是关闭拉流
1 2 3 4 5 | //主播端停止拉流 public func anchorStopPlay () { self . livePlayer . stopPlay () self . livePusher ?. setMix ( nil ) } |
以上就是直播方面的封装代码,如果不接连麦功能可直接指定View去显示拉流的视图进行展示就行,拉流地址找后台要,有问题的请在下方留言
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步