1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          iOS音視頻接入- TRTC語音聊天室

          來源:互聯網轉載 時間:2024-01-29 08:26:21

          語音聊天室簡介

          我們在之前的文章中已經了解了TRTC的1v1和多人語音聊天,本篇文章來了解下TRTC的語音聊天室。

          適用場景

          1. 純語音社交
          2. 在線KTV
          3. 連麥開黑
          4. 多人相親
          5. 陪伴房
          6. 狼人殺、劇本殺

          可提供功能

          1. 麥位管理
          2. 語音互動
          3. 文字聊天
          4. 背景音樂播放
          5. 音效設置
          6. 開關麥克風與遠端音頻的開關

          可復用的官方Demo

          TRTC SDK為我們提供了官方的語音聊天室的Demo,為了方便開發者快速接如及實現功能,其Demo內的model與UI均可復用至自己的工程內部,可按照自己功能需求在此基礎上進行修改。

          官方Demo位置

          語音聊天室的Demo位置

          可復用模塊

          model:可完全復用及根據自己需求刪減

          UI:可完全復用及根據自己需求刪減

          表格列出了各個 swift 文件或文件夾及其所對應的 UI 界面,可根據自己的需求二次修改

          文件或文件夾

          功能描述

          TRTCVoiceRoomEnteryController

          該文件包含所有 ViewController 的初始化獲取方法,您可以通過該實例,快速獲取 ViewController 對象。

          NetworkRoomManager

          業務后臺交互相關。

          TRTCCreateVoiceRoomViewController

          創建語音聊天室頁面邏輯。

          TRTCVoiceRoomListViewController

          列表頁面邏輯。

          TRTCVoiceRoomViewController

          主房間頁面,包括主播和觀眾兩種界面。

          官方Demo運行后截圖

          Demo運行截圖

          集成步驟

          我們以復用Demo的model模塊,自定義UI的集成步驟為例。

          第一步:導入所需SDK

          pod 'TXIMSDK_iOS'pod 'TXLiteAVSDK_TRTC'

          第二步:配置隱私權限

          向系統申請使用權限,在info.plist文件中添加一下兩個key和對應的描述:

          key

          描述

          Privacy - Camera Usage Description

          App需要使用攝像頭權限,開啟后才會有視頻畫面

          Privacy - Microphone Usage Description

          App需要使用麥克風權限,開啟后才會有語音信息

          第三步:復用TRTCVoiceRoom組件

          將官方Demo中的model文件夾拖入自己的工程內部即可。如有頭文件導入報錯,請在工程內部的PCH文件導入所需SDK的頭文件即可。

          第四步:創建并登錄組件

          1. 調用 TRTCVoiceRoomImp 的sharedInstance類方法可以創建一個遵守 TRTCVoiceRoom 協議的實例對象。也可以使用調用shared類方法,獲取 TRTCVoiceRoomImp實例對象直接使用,二者在 TRTCVoiceRoom 的接口使用上沒有任何區別。
          2. 調用setDelegate函數注冊組件的事件回調通知。
          3. 調用login函數完成組件的登錄,請參考下表填寫關鍵參數:參數名作用sdkAppId您可以在 實時音視頻控制臺 中查看 SDKAppID。userId當前用戶的 ID,字符串類型,只允許包含英文字母(a-z、A-Z)、數字(0-9)、連詞符(-)和下劃線(_)。userSig騰訊云設計的一種安全保護簽名,獲取方式請參考 如何計算 UserSig。callback登錄回調,成功時 code 為0。
          //初始化TRTCVoiceRoomvoiceRoom = [TRTCVoiceRoom sharedInstance];//設置代理,實現代理方法接收回調voiceRoom.delegate = self;//登錄組件[[TRTCVoiceRoom sharedInstance] login:SDKAPPID userId:userID userSig:userSig callback:^(int32_t code, NSString * _Nonnull message) {}];

          通過官方Demo查看流程及實現

          一、登錄組件

          1. TRTCVoiceRoom組件的登錄是在PortalViewController(為功能選擇頁)內實現,在跳轉聊天室列表控制器前調用登錄組件方法

          - (void)gotoVoiceRoomView {    NSString *userID = [[ProfileManager shared] curUserID];    NSString *userSig = [[ProfileManager shared] curUserSig];    //登錄組件    [self.voiceRoom login:SDKAPPID userId:userID userSig:userSig callback:^(int32_t code, NSString * _Nonnull message) {        NSLog(@"login voiceroom success.");    }];    LoginResultModel *curUser = [[ProfileManager shared] curUserModel];    //設置自己的昵稱和頭像信息    [self.voiceRoom setSelfProfile:curUser.name avatarURL:curUser.avatar callback:^(int32_t code, NSString * _Nonnull message) {        NSLog(@"voiceroom: set self profile success.");    }];    //進入房間列表頁    TRTCVoiceRoomEnteryControl* container = [[TRTCVoiceRoomEnteryControl alloc] initWithSdkAppId:SDKAPPID userId:userID];    UIViewController* vc = [container makeEntranceViewController];    [self.navigationController pushViewController:vc animated:YES];}

          2. 組件登錄成功后即可進入聊天室列表,選擇聊天進入或者創建一個聊天室。

          二、 創建聊天室

          1. 在創建聊天室前還需要對聊天室的房間 ID、上麥是否需要房主確認、麥位數、房間主題、昵稱、房間的音質等信息進行提前組裝,Demo在跳轉到TRTCVoiceRoomViewController后在viewDidLoad方法內部通過TRTCVoiceRoomViewModel創建房間。

             func createRoom() {        //組裝創建房間前參數        let userId = ProfileManager.shared.curUserID() ?? dependencyContainer.userId        let coverAvatar = ProfileManager.shared.curUserModel?.avatar ?? ""        let roomId = getRoomId()        let roomInfo = VoiceRoomInfo.init(roomID: roomId, ownerId: userId, memberCount: 7)        roomInfo.ownerName = userName        roomInfo.coverUrl = coverAvatar        roomInfo.roomName = roomName        roomInfo.needRequest = needRequest        //跳轉TRTCVoiceRoomViewController        let vc = self.dependencyContainer.makeVoiceRoomViewController(roomInfo:roomInfo, role: .anchor, toneQuality: self.toneQuality)        viewResponder?.push(viewController: vc)    }

          由于騰訊云暫不提供聊天室列表管理,所以需要我們自己來管理創建的聊天室列表。在Demo中也可看到此問題,在創建聊天室和主播銷毀聊天室的時候各發送了一個網絡請求給后端,有后端來記錄目前存在的聊天室,生成列表。

              public func createRoom(toneQuality: Int = 0) {        var coverUrl = roomInfo.coverUrl        if !coverUrl.hasPrefix("http") {            coverUrl = ProfileManager.shared.curUserModel?.avatar ?? ""        }        //設置音質        voiceRoom.setAuidoQuality(quality: toneQuality)        //設置用戶信息        voiceRoom.setSelfProfile(userName: roomInfo.ownerName, avatarURL: coverUrl) { [weak self] (code, message) in            guard let `self` = self else { return }            TRTCLog.out("setSelfProfile(code)(message)")            //向后端發送創建房間的網絡請求            TRTCVoiceRoomManager.shared.createRoom(sdkAppID: SDKAPPID, roomID: "(self.roomInfo.roomID)", success: { [weak self] in                guard let `self` = self else { return }                //真正利用TRTCVoiceRoom創建房間                self.internalCreateRoom()            }) { [weak self] (code, message) in                guard let `self` = self else { return }                if code == -1301 {                    self.internalCreateRoom()                } else {                    self.viewResponder?.showToast(message: "創建房間失敗")                    self.viewResponder?.popToPrevious()                }            }        }    }

          TRTCVoiceRoom創建房間方法

          /*** 創建房間(主播調用)** 主播正常的調用流程是:* 1. 主播調用`createRoom`創建新的語音聊天室,此時傳入房間 ID、上麥是否需要房主確認、麥位數等房間屬性信息。* 2. 主播創建房間成功后,調用`enterSeat`進入座位。* 3. 主播收到組件的`onSeatListChange`麥位表變化事件通知,此時可以將麥位表變化刷新到 UI 界面上。* 4. 主播還會收到麥位表有成員進入的`onAnchorEnterSeat`的事件通知,此時會自動打開麥克風采集。** - parameter roomID       房間標識,需要由您分配并進行統一管理。* - parameter roomParam    房間信息,用于房間描述的信息,例如房間名稱,封面信息等。如果房間列表和房間信息都由您的服務器自行管理,可忽略該參數。* - parameter callback     創建房間的結果回調,成功時 code 為0.*/- (void)createRoom:(int)roomID roomParam:(VoiceRoomParam *)roomParam callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(createRoom(roomID:roomParam:callback:));

          房間創建成功后需要房主進入占座

              private func takeMainSeat() {        //房主進入占座        voiceRoom.enterSeat(seatIndex: 0) { [weak self] (code, message) in            guard let `self` = self else { return }            if code == 0 {                self.viewResponder?.showToast(message: "房主占座成功")            } else {                self.viewResponder?.showToast(message: "房主占座失敗")            }        }    }    TRTCVoiceRoom方法          * 主動上麥(觀眾端和主播均可調用)** 上麥成功后,房間內所有成員會收到`onSeatListChange`和`onAnchorEnterSeat`的事件通知。** - parameter seatIndex    需要上麥的麥位序號* - parameter callback     操作回調*/- (void)enterSeat:(NSInteger)seatIndex callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(enterSeat(seatIndex:callback:)); 

          占座成功后,收到 onSeatListChange 事件通知,更新座位狀態。

          /// 房間座位變更回調/// @param seatInfolist 座位列表信息- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolist

          三、主播端操作

          主播端主要流程

          創建房間

          房間創建好、主播占座后即可等待觀眾加入房間。當觀眾進入房間后主播和觀眾都會回調

          /// 觀眾進房回調/// @param userInfo 觀眾信息- (void)onAudienceEnter:(VoiceRoomUserInfo *)userInfoNS_SWIFT_NAME(onAudienceEnter(userInfo:));

          邀請觀眾上麥

          現在有已經有觀眾在房間內部,主播想與觀眾進行互動,主播可以邀請觀眾上麥,可調用

          /*** 向用戶發送邀請** - parameter cmd      業務自定義指令* - parameter userId   邀請的用戶ID* - parameter content  邀請的內容* - parameter callback 發送結果回調* - returns: inviteId 用于標識此次邀請ID*/- (NSString *)sendInvitation:(NSString *)cmd                      userId:(NSString *)userId                     content:(NSString *)content                    callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(sendInvitation(cmd:userId:content:callback:));

          向觀眾發送邀請信令。

          當觀眾接受邀請的時候調用以下方法上麥

          /*** 抱人上麥(主播調用)** 主播抱人上麥,房間內所有成員會收到`onSeatListChange`和`onAnchorEnterSeat`的事件通知。** - parameter seatIndex    需要抱麥的麥位序號* - parameter userId       用戶id* - parameter callback     操作回調*/- (void)pickSeat:(NSInteger)seatIndex userId:(NSString *)userId callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(pickSeat(seatIndex:userId:callback:));

          當觀眾接受主播邀請后房間內所有人會收到

          /// 房間作為變更回調/// @param seatInfolist 座位列表信息- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolistNS_SWIFT_NAME(onSeatListChange(seatInfoList:));

          /// 主播上麥回調/// @param index 麥位號/// @param user 用戶信息- (void)onAnchorEnterSeat:(NSInteger)index                              user:(VoiceRoomUserInfo *)userNS_SWIFT_NAME(onAnchorEnterSeat(index:user:));

          兩個回調。

          取消邀請

          在主播發送邀請后想取消邀請可調用

          /*** 取消邀請* - parameter identifier   邀請ID* - parameter callback     接受操作的回調*/- (void)cancelInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(cancelInvitation(identifier:callback:));

          踢人下麥

          當主播發現上麥的觀眾出現違背直播間規則時可調用以下方法將其下麥。

          /** * 踢人下麥(主播調用) * * 主播踢人下麥,房間內所有成員會收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。 * * - parameter seatIndex    需要踢下麥的麥位序號 * - parameter callback     操作回調 */- (void)kickSeat:(NSInteger)seatIndex callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(kickSeat(seatIndex:callback:));

          靜音/解禁對應麥位的麥克風

          主播發現座位上觀眾的麥聲音有異常時可調用以下方法進行靜音或解禁

          /*** 靜音/解禁對應麥位的麥克風(主播調用)** - parameter seatIndex    麥位序號* - parameter isMute       true : 靜音,false : 解除靜音* - parameter callback     操作回調*/- (void)muteSeat:(NSInteger)seatIndex isMute:(BOOL)isMute callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(muteSeat(seatIndex:isMute:callback:));

          封禁/解禁某個麥位

          主播需要需要禁止某個麥位的時候可以調用以下方法

          /*** 封禁/解禁某個麥位(主播調用)** - parameter seatIndex    麥位序號* - parameter isClose      true : 封禁,false : 解除封禁* - parameter callback     操作回調*/- (void)closeSeat:(NSInteger)seatIndex isClose:(BOOL)isClose callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(closeSeat(seatIndex:isClose:callback:));

          主播同意觀眾上麥申請

          /*** 接受邀請** - parameter identifier   邀請ID* - parameter callback     接受操作的回調*/- (void)acceptInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(acceptInvitation(identifier:callback:));

          解散房間

          /*** 銷毀房間(主播調用)** 主播在創建房間后,可以調用這個函數來銷毀房間。*/- (void)destroyRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(destroyRoom(callback:));

          主播端麥位管理流程

          1. pickSeat傳入對應的麥位和觀眾 userId, 可以抱人上麥,房間內所有成員會收到onSeatListChangeonAnchorEnterSeat的事件通知。
          2. kickSeat傳入對應麥位后,可以踢人下麥,房間內所有成員會收到onSeatListChangeonAnchorLeaveSeat的事件通知。
          3. muteSeat傳入對應麥位后,可以靜音/解除靜音,房間內所有成員會收到 onSeatListChangeonSeatMute 的事件通知。
          4. closeSeat傳入對應麥位后,可以封禁/解禁某個麥位,封禁后觀眾端將不能再上麥,房間內所有成員會收到onSeatListChangeonSeatClose的事件通知。
          主播端麥位管理

          四、觀眾端操作及回調

          觀眾在房間前的基本準備與主播端一致,主要區別在于進房時的角色是觀眾的角色進入房間。

          觀眾端流程

          1. 觀眾端登錄米塊后,可以調用setSelfProfile設置自己的昵稱和頭像。
          2. 觀眾端向業務后臺獲取最新的語音聊天室房間列表。說明:Demo 中的語音聊天室列表僅做演示使用,語音聊天室列表的業務邏輯千差萬別,騰訊云暫不提供語音聊天室列表的管理服務,請自行管理您的語音聊天室列表。
          3. 觀眾端調用getRoomInfoList獲取房間的詳細信息,該信息是在主播端調用createRoom創建語音聊天室時設置的簡單描述信息。
          4. 觀眾選擇一個語音聊天室,調用enterRoom并傳入房間號即可進入該房間。
          5. 進房后會收到組件的onRoomInfoChange房間屬性變化事件通知,此時可以記錄房間屬性并做相應改變,例如 UI 展示房間名、記錄上麥是否需要請求主播同意等。
          6. 進房后會收到組件的onSeatListChange麥位表變化事件通知,此時可以將麥位表變化刷新到 UI 界面上。
          7. 進房后還會收到麥位表有主播進入的onAnchorEnterSeat的事件通知。
          觀眾端流程

          進入房間

          /*** 進入房間(觀眾調用)** 觀眾觀看直播的正常調用流程如下:* 1.【觀眾】向您的服務端獲取最新的語音聊天室列表,可能包含多個直播間的 roomId 和房間信息。* 2. 觀眾選擇一個語音聊天室,調用`enterRoom`并傳入房間號即可進入該房間。* 3. 進房后會收到組件的`onRoomInfoChange`房間屬性變化事件通知,此時可以記錄房間屬性并做相應改變,例如 UI 展示房間名、記錄上麥是否需要請求主播同意等。* 4. 進房后會收到組件的`onSeatListChange`麥位表變化事件通知,此時可以將麥位表變化刷新到 UI 界面上。* 5. 進房后還會收到麥位表有主播進入的`onAnchorEnterSeat`的事件通知。** - parameter roomID   房間標識* - parameter callback 進入房間是否成功的結果回調*/- (void)enterRoom:(NSInteger)roomID callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(enterRoom(roomID:callback:));

          觀眾上麥

          觀眾向主播發起上麥

          /*** 向用戶發送邀請** - parameter cmd      業務自定義指令* - parameter userId   邀請的用戶ID* - parameter content  邀請的內容* - parameter callback 發送結果回調* - returns: inviteId 用于標識此次邀請ID*/- (NSString *)sendInvitation:(NSString *)cmd                      userId:(NSString *)userId                     content:(NSString *)content                    callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(sendInvitation(cmd:userId:content:callback:));

          當主播開啟上麥驗證后,主播端會回調以下方法,此時主播端可同意和拒絕該申請

          /// 邀請信息接收回調/// @param identifier 目標用戶ID/// @param inviter 邀請者ID/// @param cmd 信令/// @param content 內容- (void)onReceiveNewInvitation:(NSString *)identifier                       inviter:(NSString *)inviter                           cmd:(NSString *)cmd                       content:(NSString *)contentNS_SWIFT_NAME(onReceiveNewInvitation(identifier:inviter:cmd:content:));

          觀眾下麥

          可調用以下方法主動下麥

          /*** 主動下麥(觀眾端和主播均可調用)** 下麥成功后,房間內所有成員會收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。** - parameter callback 操作回調*/- (void)leaveSeat:(ActionCallback _Nullable)callback NS_SWIFT_NAME(leaveSeat(callback:));

          退出房間

          /*** 退出房間** - parameter callback 退出房間是否成功的結果回調*/- (void)exitRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(exitRoom(callback:));

          本地音頻操作接口

          /*** 開啟麥克風采集*/- (void)startMicrophone;/*** 停止麥克風采集*/- (void)stopMicrophone;/*** 設置音質** - parameter quality TRTC_AUDIO_QUALITY_MUSIC/TRTC_AUDIO_QUALITY_DEFAULT/TRTC_AUDIO_QUALITY_SPEECH*/- (void)setAuidoQuality:(NSInteger)quality NS_SWIFT_NAME(setAuidoQuality(quality:));/*** 開啟本地靜音** - parameter mute 是否靜音*/- (void)muteLocalAudio:(BOOL)mute NS_SWIFT_NAME(muteLocalAudio(mute:));/*** 設置開啟揚聲器** - parameter useSpeaker  true : 揚聲器,false : 聽筒*/- (void)setSpeaker:(BOOL)userSpeaker NS_SWIFT_NAME(setSpeaker(userSpeaker:));

          音質設置

          可通過TRTCCloud來獲取音效管理類,并設置音質效果。

          /*** 獲取音效管理類 TXAudioEffectManager** 該模塊是整個 SDK 的音效管理模塊,支持如下功能:* - 耳機耳返:麥克風捕捉的聲音實時通過耳機播放。* - 混響效果:KTV、小房間、大會堂、低沉、洪亮...* - 變聲特效:蘿莉、大叔、重金屬、外國人...* - 背景音樂:支持在線音樂和本地音樂,支持變速、變調等特效、支持原生和伴奏并播放和循環播放。* - 短音效:鼓掌聲、歡笑聲等簡短的音效文件,對于小于10秒的文件,請將 isShortFile 參數設置為 YES。*/- (TXAudioEffectManager *)getAudioEffectManager;

          此處有更加詳細的API介紹及聯動回調方法!

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          天津哪有廚具批發市場?解放橋旁邊靠近勸業場一側的那條街是專門做廚具的。另外河西樂園旁邊也有家廚具城,,一樣這兩個地方是天津津批零比較集中的地方。天津哪里有賣廚具的_?天津的批發廚具用品市場有很多,比較被當地人接受和認知(熟悉)的是以下幾處:1、在樂園,前進道的天津廚具城,就是前進道與白云路交叉口區域,里面廚具挺齊全的。2、解放橋南頭那,有個專門批發廚具的,地址:和平區解放北路21號。3、中國北方五...

          11對戰平臺警告!檢測到不匹配是怎么回事?不運行某些程序的時候,經常會會直接出現出現了,接著該程序就關了。就像再次出現這個現象有方面的,一是硬件,即內存方面有問題,二是軟件,這就有多方面的問題了。故障分析硬件方面:一般來說,內存又出現問題的可能性并不大,比較多方面是:內存條主板壞、內存質量有問題,有應該是2個差別牌子不同容量的內存混插,也也很很容易再次出現不不兼容的情況,同樣的也要注意一點散熱問題...

          k515時刻表 k515列車上有多少座?k515運行狀態? K515列車是從吉林起點站到上?;疖囌镜目焖倭熊?。每天8點25分,33小時零8分到達終點站。每節普通硬座車廂有118個座位。硬臥車廂有60或66個座位和54個座位。每個小房間有6張床,每邊有中下三張床。每張床對應購買的票號,其他床號不能隨意占用。 k515次列車路線? K518/K515從吉林站到上海站共有29站,08:25出發,...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>