tencent cloud

文档反馈

集成 TUILiveRoom (iOS)

最后更新时间:2022-04-25 11:47:52

    组件介绍

    TUILiveRoom 是一个开源的音视频 UI 组件,通过在项目中集成 TUILiveRoom 组件,您只需要编写几行代码就可以为您的 App 添加“视频互动直播”等场景。TUILiveRoom 同时支持 AndroidFlutter等平台,基本功能如下图所示:

    组件集成

    步骤一:下载并导入 TUILiveRoom 组件

    在您的 xcode 工程 Podfile 文件同一级目录下创建 TUILiveRoom 文件夹,将 Github仓库 iOS 目录 下的 TXAppBasicTCBeautyKitResourcesSourceTUIVoiceRoom.podspec 等文件拷贝至您在自己工程创建的 TUILiveRoom 目录下。并完成如下导入动作:

    • 打开工程的 Podfile 文件,引入TUILiveRoom.podspec,参考如下:
    # :path => "指向TXAppBasic.podspec所在目录的相对路径"
    pod 'TXAppBasic', :path => "TUILiveRoom/TXAppBasic/"
    # :path => "指向TCBeautyKit.podspec所在目录的相对路径"
    pod 'TCBeautyKit', :path => "TUILiveRoom/TCBeautyKit/"
    # :path => "指向TUILiveRoom.podspec所在目录的相对路径"
    pod 'TUILiveRoom', :path => "TUILiveRoom/", :subspecs => ["TRTC"]
    
    • 终端进入 Podfile 所在的目录下,执行 pod install,参考如下:
      pod install
      

    步骤二:配置权限及混淆规则

    在 info.plist 文件中依次添加 Privacy > Microphone Usage Description 申请麦克风权限、Privacy > Camera Usage Description申请相机权限。

    <key>NSMicrophoneUsageDescription</key>
    <string>LiveRoom需要访问您的麦克风权限,开启后录制的视频才会有声音</string>
    <key>NSCameraUsageDescription</key>
    <string>LiveRoom需要访问您的相机权限,开启后录制的视频才会有画面</string>
    

    步骤三:初始化并登录

    let mTRTCLiveRoom = TRTCLiveRoom()
    //useCDNFirst:true 表示普通观众通过 CDN 观看,false 表示普通观众通过低延时观看
    //CDNPlayDomain:表示 CDN 观看时配置的播放域名
    let config = TRTCLiveRoomConfig(useCDNFirst: useCDNFirst, cdnPlayDomain: yourCDNPlayDomain)
    mTRTCLiveRoom.login(SDKAPPID, userID, userSig, config) { (code, error) in
      if code == 0 {
        //登录成功
      }
    }
    

    参数说明:

    • SDKAppIDTRTC 应用 ID,如果您未开通腾讯云 TRTC 服务,可进入 腾讯云实时音视频控制台,创建一个新的 TRTC 应用后,单击应用信息,SDKAppID 信息如下图所示:
    • SecretkeyTRTC 应用密钥和 SDKAppId 对应,进入 TRTC 应用管理 后,SecretKey 信息如上图所示。
    • userId:当前用户的 ID,字符串类型,只允许包含英文字母(a-z 和 A-Z)、数字(0-9)、连词符(-)和下划线(_)。建议结合业务实际账号体系自行设置。
    • userSig:根据 SDKAppId、userId,Secretkey等信息计算得到的安全保护签名,您可以单击 这里 直接在线生成一个调试的userSig,也可以参照我们的 示例工程 自行计算,更多信息见 如何计算及使用 UserSig

    步骤四:实现视频互动直播间

    1. 主播端开播 TRTCLiveRoom#createRoom

      // 1.主播设置昵称和头像
      mTRTCLiveRoom.setSelfProfile(name: "A", avatarURL: "faceUrl", callback: nil)
      // 2.主播开播前预览并设置美颜参数
      let view = UIView()
      parentView.add(view)
      mTRTCLiveRoom.startCameraPreview(frontCamera: true, view: view, callback: nil)
      mTRTCLiveRoom.getBeautyManager().setBeautyStyle(.nature)
      mTRTCLiveRoom.getBeautyManager().setBeautyLevel(6)
      // 3.主播创建房间
      let param = TRTCCreateRoomParam(roomName: "测试房间", coverUrl: "")
      mTRTCLiveRoom.createRoom(roomID: 123456789, roomParam: param) { [weak self] (code, error) in
      if code == 0 {
      // 4.主播开启推流并将流发布到 CDN
      self?.mTRTCLiveRoom.startPublish(streamID: mSelfUserId + "_stream", callback: nil)
      }
      }
      
    2. 观众端观看 TRTCLiveRoom#enterRoom

      // 1.假定您从业务后台获取房间列表为 roomList
      var roomList: [UInt32] = GetRoomList()
      // 2.通过调用 getRoomInfos 获取房间的详细信息
      mTRTCLiveRoom.getRoomInfos(roomIDs: roomList, callback: { (code, msg, list) in
      if code == 0 {
        // 获取到房间详细信息后,您可以在主播列表页面展示主播昵称、头像等相关信息
      }
      })
      // 3.选择房间 roomid 进入
      mTRTCLiveRoom.enterRoom(roomID: roomID, callback: callback)
      // 4.观众收到主播进房通知,开始播放
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onAnchorEnter userID: String) {
      // 5.观众播放主播画面
      mTRTCLiveRoom.startPlay(userID: userID, view: renderView, callback: nil) 
      }
      
    3. 观众与主播连麦 TRTCLiveRoom#requestJoinAnchor

      // 观众端:
      // 1.观众端发起连麦请求
      mTRTCLiveRoom.requestJoinAnchor(reason: mSelfUserId + "请求和您连麦", responseCallback: { [weak self] (agreed, reason) in 
        // 4.主播接受了观众的请求
         if agreed {
          // 5.观众启动预览,开启推流
          self?.mTRTCLiveRoom.startCameraPreview(frontCamera: true, view: localView, callback: nil)
          self?.mTRTCLiveRoom.startPublish(streamID: streamID, callback: nil)
         }        
      }, callback: callback)
      // 主播端:
      // 2.主播端收到连麦请求
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onRequestJoinAnchor user: TRTCLiveUserInfo, reason: String?, timeout: Double) {
      // 3.同意对方的连麦请求
      mTRTCLiveRoom.responseJoinAnchor(userID: userID, agree: true, reason: "同意连麦")
      }
      // 6.主播收到连麦观众的上麦通知
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onAnchorEnter userID: String) {
      // 7.主播播放观众画面
      mTRTCLiveRoom.startPlay(userID: userID, view: view, callback: nil)
      }
      
    4. 主播与主播 PK TRTCLiveRoom#requestRoomPK

      // 主播 A:
      // 主播 A 创建12345的房间
      mTRTCLiveRoom.createRoom(roomID: 12345, roomParam: param, callback: nil)
      // 1.主播 A 向主播 B 发起 PK 请求
      mTRTCLiveRoom.requestRoomPK(roomID: 54321, userID: "B", responseCallback: { (agree, reason) in
      // 5.收到是否同意的回调
      if agree {
      }       
      }, callback: callback)
      // 主播 A 收到主播 B 进入回调
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onAnchorEnter userID: String) {
      // 6.收到 B 进房的通知,播放 B 的画面
      mTRTCLiveRoom.startPlay(userID: userID, view: view, callback: callback)
      }
      // 主播 B:
      // 主播 B 创建54321的房间
      mTRTCLiveRoom.createRoom(roomID: 54321, roomParam: param, callback: nil)
      // 2.主播 B 收到主播 A 的消息
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onRequestRoomPK user: TRTCLiveUserInfo, timeout: Double) {
      // 3.主播 B 回复主播 A 接受请求
      mTRTCLiveRoom.responseRoomPK(userID: userID, agree: true, reason: reason)
      }
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onAnchorEnter userID: String) {
      // 4.主播 B 收到主播 A 进房的通知,播放主播 A 的画面
      mTRTCLiveRoom.startPlay(userID: userID, view: view, callback: callback)
      }
      
    5. 实现文字聊天 TRTCLiveRoom#sendRoomTextMsg

      // 发送端:发送文本消息
      mTRTCLiveRoom.sendRoomTextMsg(message: "Hello Word!", callback: callback)
      // 接收端:监听文本消息
      mTRTCLiveRoom.delegate = self
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onRecvRoomTextMsg message: String, fromUser user: TRTCLiveUserInfo) {
      debugPrint("收到来自\(user.userName)的文本消息:\(message)")
      }
      
    6. 实现弹幕消息 TRTCLiveRoom#sendRoomCustomMsg

      // 发送端:您可以通过自定义Cmd来区分弹幕和点赞消息
      // eg:"CMD_DANMU"表示弹幕消息,"CMD_LIKE"表示点赞消息
      mTRTCLiveRoom.sendRoomCustomMsg(command: "CMD_DANMU", message: "Hello world", callback: nil)
      mTRTCLiveRoom.sendRoomCustomMsg(command: "CMD_LIKE", message: "", callback: nil)
      // 接收端:监听自定义消息
      mTRTCLiveRoom.delegate = self
      public func trtcLiveRoom(_ trtcLiveRoom: TRTCLiveRoom, onRecvRoomCustomMsg command: String, message: String, fromUser user: TRTCLiveUserInfo) {
      if "CMD_DANMU" == command {
      // 收到弹幕消息
      debugPrint("收到来自\(user.userName)的弹幕消息:\(message)")
      } else if "CMD_LIKE" == command {
      // 收到点赞消息
      debugPrint("\(user.userName)给您点了个赞!")
      }
      }
      

    常见问题

    如果有任何需要或者反馈,您可以联系:colleenyu@tencent.com。

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持