我們在之前的文章中已經了解了TRTC的1v1和多人語音聊天,本篇文章來了解下TRTC的語音聊天室。
TRTC SDK為我們提供了官方的語音聊天室的Demo,為了方便開發者快速接如及實現功能,其Demo內的model與UI均可復用至自己的工程內部,可按照自己功能需求在此基礎上進行修改。
model:可完全復用及根據自己需求刪減
UI:可完全復用及根據自己需求刪減
表格列出了各個 swift 文件或文件夾及其所對應的 UI 界面,可根據自己的需求二次修改
文件或文件夾 | 功能描述 |
---|---|
TRTCVoiceRoomEnteryController | 該文件包含所有 ViewController 的初始化獲取方法,您可以通過該實例,快速獲取 ViewController 對象。 |
NetworkRoomManager | 業務后臺交互相關。 |
TRTCCreateVoiceRoomViewController | 創建語音聊天室頁面邏輯。 |
TRTCVoiceRoomListViewController | 列表頁面邏輯。 |
TRTCVoiceRoomViewController | 主房間頁面,包括主播和觀眾兩種界面。 |
我們以復用Demo的model模塊,自定義UI的集成步驟為例。
pod 'TXIMSDK_iOS'pod 'TXLiteAVSDK_TRTC'
向系統申請使用權限,在info.plist文件中添加一下兩個key和對應的描述:
key | 描述 |
---|---|
Privacy - Camera Usage Description | App需要使用攝像頭權限,開啟后才會有視頻畫面 |
Privacy - Microphone Usage Description | App需要使用麥克風權限,開啟后才會有語音信息 |
將官方Demo中的model文件夾拖入自己的工程內部即可。如有頭文件導入報錯,請在工程內部的PCH文件導入所需SDK的頭文件即可。
sharedInstance
類方法可以創建一個遵守 TRTCVoiceRoom 協議的實例對象。也可以使用調用shared
類方法,獲取 TRTCVoiceRoomImp實例對象直接使用,二者在 TRTCVoiceRoom 的接口使用上沒有任何區別。setDelegate
函數注冊組件的事件回調通知。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) {}];
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:));
pickSeat
傳入對應的麥位和觀眾 userId, 可以抱人上麥,房間內所有成員會收到onSeatListChange
和onAnchorEnterSeat
的事件通知。kickSeat
傳入對應麥位后,可以踢人下麥,房間內所有成員會收到onSeatListChange
和onAnchorLeaveSeat
的事件通知。muteSeat
傳入對應麥位后,可以靜音/解除靜音,房間內所有成員會收到 onSeatListChange
和 onSeatMute
的事件通知。closeSeat
傳入對應麥位后,可以封禁/解禁某個麥位,封禁后觀眾端將不能再上麥,房間內所有成員會收到onSeatListChange
和onSeatClose
的事件通知。觀眾在房間前的基本準備與主播端一致,主要區別在于進房時的角色是觀眾的角色進入房間。
setSelfProfile
設置自己的昵稱和頭像。getRoomInfoList
獲取房間的詳細信息,該信息是在主播端調用createRoom
創建語音聊天室時設置的簡單描述信息。enterRoom
并傳入房間號即可進入該房間。onRoomInfoChange
房間屬性變化事件通知,此時可以記錄房間屬性并做相應改變,例如 UI 展示房間名、記錄上麥是否需要請求主播同意等。onSeatListChange
麥位表變化事件通知,此時可以將麥位表變化刷新到 UI 界面上。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出發,...