多方音视频 iOS SDK 使用说明
版本历史
修改时间 | 修改说明 |
---|---|
2021 年 01 月 11日 | 完成首版文档 |
目录结构
第1部分----------集成SDK
第2部分----------流程说明
第3部分----------使用示例
第4部分----------参考资料
术语说明
术语 | 术语说明 |
---|---|
视频通话 | 支持语音和视频的双向通话 |
1 集成SDK
1.1 添加SDK所需权限
1.1.1 使用 sdk 前请在 Xcode -> Targets -> Info 中添加以下麦克风及摄像头权限,用于音视频采集
1. Privacy - Microphone Usage Description
2. Privacy - Camera Usage Description
1.2 手动添加相关库
在 Xcode -> Targets -> Build Phases -> Link Binary With Libraries中,添加如下库:
CoreMedia、AudioToolbox、VideoToolbox.framework、OpenAL.framework、AVFoundation.framework、libc++、libiconv.2.4.0、libbz2、libz
1.3 关闭 Bitcode
请将 Xcode -> Targets -> Build Settings -> Enable Bitcode 设置为 NO。
当你正确完成以上三个步骤后,您就已经成功集成SDK,接下来可以开始使用SDK。
2 流程说明
在您开始使用SDK之前,或者当您在使用SDK 过程中遇到疑问时,您可以通过以下流程图大致了解SDK的工作流程,以便您更好的了解和使用SDK。
3 使用示例
3.1 头文件介绍
关键头文件
#import "EZVideoTalkSDK.h" //包含SDK核心功能
#import "EZVideoTalkView.h" //本地通话窗口
#import "EZVideoTalkParam.h" //音视频通话参数
#import "EZMediaSessionVideoParam.h" //音视频采集参数
3.2 使用示例代码
关键接口
#pragma mark - SDK
/**
SDK初始化
@param param 必填 配置参数
@param localWin 本地窗口
@return 返回值
*/
- (instancetype)initWithParam:(EZMediaSessionVideoParam *)param
localWindow:(EZVideoTalkView *)localWin;
/// 设置远程窗口
/// 1.必须在拿到远端客户端加入的消息后设置;
/// 2.必须在主线程调用;
/// 3.结束后需要将window只为nil;
/// @param remoteWin 远端窗口
/// @param clientID 加入的客户端的ID
- (int32_t)setRemoteWindow:(UIView * _Nullable)remoteWin ofClient:(int32_t)clientID;
/**
开始双向音视频对讲,耗时接口,默认 EZVideoTalkCaptureVideo | EZVideoTalkCaptureAudio 同时开启
*/
- (void)startWithBAVParam:(EZVideoTalkParam *)param;
/**
开始双向音视频对讲,耗时接口
@param param 必填 配置参数
@param type 采集类型
*/
- (void)startWithBAVParam:(EZVideoTalkParam *)param type:(EZVideoTalkCaptureType)type;
/**
停止双向音视频对讲
*/
- (void)stop;
/// 本地采集的音频或者是视频配置,可以在音视频通话过程中切换
/// @param type EZMediaCaptureSessionType
- (int32_t)configCaptureType:(EZVideoTalkCaptureType)type;
/// 开启声音,接收到EZVideoTalkMessageStartInputData消息后调用
/// @param open 开关状态
/// @param clientId clientId
- (int32_t) openSound:(BOOL)open forClient:(int32_t)clientId;
/**
切换对讲时使用的摄像头,默认采用前置 同步接口
@param backCameraSelected YES:选择后置,NO:选择前置
@return 成功返回 noErr,失败返回错误码
*/
- (int32_t)switchCamera:(BOOL)backCameraSelected;
#pragma mark - 日志调试
/**
日志设置
@param enable 是否打印日志
@param logCallback 日志回调,上层自定义处理
*/
+ (void)setDebugLogEnable:(BOOL)enable withLogCallback:(void(^)(NSString *logStr))logCallback;
/**
打开对端码流抓取
@param enble 是否打开
*/
+(void)setDebugVideoLog:(BOOL)enble;
/**
获取sdk版本信息
@return 版本号
*/
+ (NSString*)getVersion;
示例代码
1. 创建/获取会议信息
//创建会议信息
[EZOpenSDK requestCallingMeetingInfo:self.pageSetting.password completion:^(int32_t roomId, NSString *vtmAddress, NSError *error) {
//todo
}];
//加入方获取会议信息
[EZOpenSDK requestCalledMeetingInfo:self.pageSetting.roomId completion:^(int32_t roomId, NSString *vtmAddress, NSError *error) {
//todo
}];
2. 设置采集参数,初始化SDK
EZMediaSessionVideoParam *mediaParam = [EZMediaSessionVideoParam new];
mediaParam.pixelWidth = 320;
mediaParam.pixelHeigth = 320;
mediaParam.videoOrientation = AVCaptureVideoOrientationPortrait;
mediaParam.encodeKeyFrameInterval = 4;
[EZVideoTalkSDK setDebugVideoLog:YES];
[EZVideoTalkSDK setDebugLogEnable:YES withLogCallback:^(NSString *logStr) {
NSLog(@"EZVideoTalkSDK-----%@", logStr);
}];
_client = [[EZVideoTalkSDK alloc] initWithParam:mediaParam localWindow:self.localWin];
_client.delegate = self;
3. 实现代理方法
- (void)videoTalk:(EZVideoTalkSDK *)client didReceivedError:(int32_t)errorCode
{
NSLog(@"%s recived errorcode:%d", __func__, errorCode);
dispatch_async(dispatch_get_main_queue(), ^{
//todo
});
}
- (void)videoTalk:(EZVideoTalkSDK *)client didReceivedMessage:(EZVideoTalkMessageType)messageCode msg:(NSDictionary *)msg;
{
dispatch_async(dispatch_get_main_queue(), ^{
if (messageCode == EZVideoTalkMessageRoomCreated) {
//todo
}
else if (messageCode == EZVideoTalkMessageStartInputData) {
//todo
}
else if (messageCode == EZVideoTalkMessagePeerEnteredRoom) {
//todo
}
else if (messageCode == EZVideoTalkMessagePeerLeaveRoom) {
//todo
}
});
}
4. 设置通话参数,开始多方通话
EZVideoTalkParam *bavParam = [EZVideoTalkParam new];
bavParam.isMultiPartyCall = YES;
bavParam.isCallingWithDevice = callingWithDev;
bavParam.iCltRole = self.pageSetting.isCalling ? 0 : 1; //主叫端传0,被叫端传1
bavParam.iStsPort = [infos.lastObject intValue];
bavParam.iRoomId = roomID > 0 ? roomID : 0;
bavParam.szOterId = callingWithDev ? self.deviceInfo.deviceSerial : @""; //主叫且含有设备的多方会话需要传设备序列号
bavParam.iChannel = callingWithDev ? self.pageSetting.channelId : 1;
bavParam.szSelfId = self.pageSetting.nickname;
bavParam.szAuthToken = token;
bavParam.szStsAddr = infos.firstObject;
bavParam.iDevStreamType = 1; //设置主子码流 1 主码流、2 子码流
[self modifyCaptureType];
[self.client startWithBAVParam:bavParam type:self.captureType];
4 参考资料
若文档有未尽之处,请参考官网 demo。