1. 程式人生 > >【音視頻】iOS CallLib 開發指南

【音視頻】iOS CallLib 開發指南

SDK 音視頻

開通方式

音視頻服務開通,請參考音視頻開通方式說明。

使用說明

由於底層引擎技術不同,2.6.0 之後的音視頻 SDK 與 2.6.0 之前的 SDK 中的實時音視頻不能互通。

音視頻 SDK 為商用收費功能,之前的 SDK 中的實時音視頻為免費測試功能,如果您還想使用之前的實時音視頻,可以使用 2.5.2 版本。

集成說明

導入 SDK

有兩種方式可以將 SDK 導入您的項目中:

  • 通過 CocoaPods 管理依賴

  • 手動導入 SDK 並管理依賴

手動導入 SDK

1、 下載 SDK 您可以到融雲官方網站下載SDK。

2、 融雲 IM SDKCall SDK 的基礎。使用 CallLib,必須同時集成使用融雲 IM SDK

。 手動導入 IM SDK,可以參考 IM SDK - 下載與導入 SDK文檔。

SDK 文件說明

文件說明註意事項
RongCallLib.frameworkCallLibframework必須導入
AgoraRtcEngineKit.framework通話引擎必須導入,否則通話功能將無法使用

3、 手動集成了融雲 SDK 之後,您需要在您的工程中導入

RongCallLib.framewrok、AgoraRtcEngineKit.framework 以及系統庫 CoreMotion.framework、VideoToolbox.framework、libresolv.tbd。

4、 在 Xcode

項目 Build Settings -> Other Linker Flags 中,增加"-ObjC"。

快速集成

使用融雲通話之前,必須先初始化 SDK 和連接服務器,詳細內容可以參考 IMLib 快速集成文檔。

1、發起通話

您可以調用 RCCallClient 以下接口,發起通話。

// RCCallCleint Class/*!
 發起一個通話

 @param conversationType 會話類型
 @param targetId         目標會話ID
 @param userIdList       邀請的用戶ID列表
 @param type             發起的通話媒體類型
 @param delegate         通話監聽
 @param extra            附件信息

 @return 呼出的通話實體
 */- (RCCallSession *)startCall:(RCConversationType)conversationType
                    targetId:(NSString *)targetId
                          to:(NSArray *)userIdList
                   mediaType:(RCCallMediaType)type
             sessionDelegate:(id<RCCallSessionDelegate>)delegate
                       extra:(NSString *)extra;

其中,您可以通過返回的通話實體,操控通話和獲取通話相關信息,通話狀態發生變化時會通過您傳入的 delegate 進行回調。

2、接收呼入的通話

您需要設置 RCCallClient 的全局通話監聽,來監聽通話呼入。

// RCCallCleint Class/*!
 設置全局通話呼入的監聽器

 @param delegate CallLib全局通話呼入的監聽器
 */- (void)setDelegate:(id<RCCallReceiveDelegate>)delegate;

3、會話是否支持發起通話

目前,SDK 支持在單聊發起單人通話,在討論組、群聊中發起多人通話。

您可以通過 RCCallClient 類的以下接口查詢當前會話的通話能力。

// RCCallClient Class/*!
 當前會話類型是否支持音頻通話

 @param conversationType 會話類型

 @return 是否支持音頻通話
 */- (BOOL)isAudioCallEnabled:(RCConversationType)conversationType;/*!
 當前會話類型是否支持視頻通話

 @param conversationType 會話類型

 @return 是否支持視頻通話
 */- (BOOL)isVideoCallEnabled:(RCConversationType)conversationType;

4、獲取當前的通話實體

您可以通過 RCCallClient 的以下接口,查詢當前的通話實體。

// RCCallClient Class/*!
 當前的通話會話實體
 */@property (nonatomic, strong, readonly) RCCallSession *currentCallSession;

5、通過通話實體操控通話

通話實體 RCCallSession 包含當前通話的所有信息,您可以通過其中的接口,操控當前通話和獲取相關信息,在發起通話和接收到呼入的通話時會獲取到相應的通話實體。

如:接聽當前來電。

// RCCallSession Class/*!
 接聽來電

 @param type 接聽使用的媒體類型
 */- (void)accept:(RCCallMediaType)type;

掛斷當前通話。

// RCCallSession Class/*!
 掛斷通話
 */- (void)hangup;

邀請用戶加入當前通話(僅限邀請討論組和群組中的成員加入)。

// RCCallSession Class/*!
 邀請用戶加入通話

 @param userIdList 用戶ID列表
 @param type       建議被邀請者使用的媒體類型
 */- (void)inviteRemoteUsers:(NSArray *)userIdList
               mediaType:(RCCallMediaType)type;

設置視頻通話中某個用戶的 View 。

// RCCallSession Class/*!
 設置用戶所在的視頻View

 @param userId 用戶ID(自己或他人)
 @param view   視頻的View
 */- (void)setVideoView:(UIView *)view
              userId:(NSString *)userId;

切換自己使用的媒體類型。

// RCCallSession Class/*!
 更換自己使用的媒體類型

 @param type 媒體類型
 */- (BOOL)changeMediaType:(RCCallMediaType)type;

一個通話中,允許每個用戶的媒體類型不一致,也就是說可以有些人以視頻接入,有些人以音頻接入。

設置靜音。

// RCCallSession Class/*!
 設置靜音狀態

 @param muted 是否靜音

 @return 是否設置成功

 @discussion 默認值為NO。
 */- (BOOL)setMuted:(BOOL)muted;

設置揚聲器狀態。

// RCCallSession Class/*!
 設置揚聲器狀態

 @param speakerEnabled  是否開啟揚聲器
 @return                是否設置成功
 */- (BOOL)setSpeakerEnabled:(BOOL)speakerEnabled;

開啟或關閉攝像頭。

// RCCallSession Class/*!
 設置攝像頭狀態

 @param cameraEnabled  是否開啟攝像頭
 @return               是否設置成功

 @discussion 音頻通話的默認值為NO,視頻通話的默認值為YES。
 */- (BOOL)setCameraEnabled:(BOOL)cameraEnabled;

切換前後攝像頭。

// RCCallSession Class/*!
 切換前後攝像頭

 @return 是否切換成功
 */- (BOOL)switchCameraMode;

6、獲取通話相關信息

您可以通過通話實體 RCCallSession 中獲取當前通話的相關信息。

當前的通話狀態。

// RCCallSession Class/*!
 通話的當前狀態
 */@property (nonatomic, assign, readonly) RCCallStatus callStatus;

通話的發起人和邀請者。

// RCCallSession Class/*!
 通話的最初發起人
 */@property (nonatomic, strong, readonly) NSString *caller;/*!
 邀請當前用戶加入通話的邀請者
 */@property (nonatomic, strong, readonly) NSString *inviter;

通話的開始時間和接通時間。

// RCCallSession Class/*!
 通話開始的時間

 @discussion 如果是用戶呼出的通話,則startTime為通話呼出時間;如果是呼入的通話,則startTime為通話呼入時間。
 */@property (nonatomic, assign, readonly) long long startTime;/*!
 通話接通時間
 */@property (nonatomic, assign, readonly) long long connectedTime;

通話掛斷的原因。

// RCCallSession Class/*!
 通話掛斷原因
 */@property (nonatomic, assign) RCCallDisconnectReason disconnectReason;

7、通話狀態的回調

如果您實現並設置了 RCCallSessionDelegate,當通話狀態發生變化的時候,會回調相關接口。

您可以在 startCall 的時候傳入或者手動設置通話狀態監聽。

    // RCCallClient Class

    /*!
     發起一個通話

     @param conversationType 會話類型
     @param targetId         目標會話ID
     @param userIdList       邀請的用戶ID列表
     @param type             發起的通話媒體類型
     @param delegate         通話監聽
     @param extra            附件信息

     @return 呼出的通話實體
     */
    - (RCCallSession *)startCall:(RCConversationType)conversationType
                        targetId:(NSString *)targetId
                              to:(NSArray *)userIdList
                       mediaType:(RCCallMediaType)type
                 sessionDelegate:(id<RCCallSessionDelegate>)delegate
                           extra:(NSString *)extra;    // RCCallSession Class

    /*!
     設置通話狀態變化的監聽器

     @param delegate 通話狀態變化的監聽器
     */
    - (void)setDelegate:(id<RCCallSessionDelegate>)delegate;

當通話狀態發生變化的時候,如接通、結束、對方振鈴、有人加入通話、有人掛斷、發生警告等都會進行回調。

// RCCallSession Class/*!
 通話狀態變化的監聽器
 */@protocol RCCallSessionDelegate <NSObject>@optional/*!
 通話已接通
 */- (void)callDidConnect;/*!
 通話已結束
 */- (void)callDidDisconnect;/*!
 對端用戶正在振鈴

 @param userId 用戶ID
 */- (void)remoteUserDidRing:(NSString *)userId;/*!
 有用戶被邀請加入通話

 @param userId    被邀請的用戶ID
 @param mediaType 希望被邀請者使用的媒體類型
 */- (void)remoteUserDidInvite:(NSString *)userId
                  mediaType:(RCCallMediaType)mediaType;/*!
 對端用戶加入了通話

 @param userId    用戶ID
 @param mediaType 用戶的媒體類型
 */- (void)remoteUserDidJoin:(NSString *)userId
                mediaType:(RCCallMediaType)mediaType;/*!
 對端用戶切換了媒體類型

 @param userId    用戶ID
 @param mediaType 切換至的媒體類型
 */- (void)remoteUserDidChangeMediaType:(NSString *)userId
                           mediaType:(RCCallMediaType)mediaType;/*!
 對端用戶開啟或管理了攝像頭的狀態

 @param userId    用戶ID
 @param muted     是否關閉攝像頭
 */- (void)remoteUserDidDisableCamera:(BOOL)disabled
                            byUser:(NSString *)userId;/*!
 對端用戶掛斷

 @param userId 用戶ID
 @param reason 掛斷的原因
 */- (void)remoteUserDidLeft:(NSString *)userId
                   reason:(RCCallDisconnectReason)reason;/*!
 通話過程中的錯誤回調

 @param error 錯誤碼

 @warning 這個接口回調的錯誤碼主要是為了提供必要的log以及提示用戶,如果是不可恢復的錯誤,SDK會掛斷電話並回調callDidDisconnect,App可以在callDidDisconnect中統一處理通話結束的邏輯。
 */- (void)errorDidOccur:(RCCallErrorCode)error;@end

實時音視頻推送設置

詳細請參考 VoIP 推送設置文檔。

更多說明

CallLib 通話不限制最大人數。如果需要限制的話,您可以在調用 startCallinviteRemoteUsers 的時候加判斷人數的邏輯。


【音視頻】iOS CallLib 開發指南