集成iOS SDK
说明
- 提供的项目以 Xcode 13.0 为例
准备环境
- Xcode 9.0 或以上版本
- 支持 iOS 9.0 或以上版本的 iOS 设备
- 支持音视频功能的模拟器或真机
下载SDK
进入RTC文档中心,点击“下载专区>SDK&Demo下载”,即可下载iOS客户端。
集成SDK
创建一个iOS项目,若已有 iOS 项目,可以直接集成 SDK。此版本SDK提供静态库及动态库形式。
添加 SDK 静态库文件
- 将下载的SDK中lib文件夹内的 BaiduRtcRoom.framework SocketRocket.framework文件复制到项目文件夹下
- 选择:项目 TARGET -> Build Phases ->Link Binary With Libraries,添加 SDK 静态库文件到项目。
- 选择:项目 TARGET -> Build Phases ->Link Binary With Libraries,将libyuv.a,libcrypto.a,libssl.a添加到项目中
- 添加依赖库
其中 :
BaiduRtcRoom 为 BRTC SDK 主依赖库,必须添加;
SocketRocket 为三方依赖库,必须添加;
libyuv.a,libcrypto.a,libssl.a为百度内部依赖库,必须添加;
其他 BaiduRtc 前缀 framework 为 BRTC SDK 扩展模块依赖库,按需添加;
其余为系统依赖库,必须添加
添加 SDK 动态库文件
若使用动态库SDK,可按以下步骤进行集成:
- 将下载的 SDK 中 dynamic 文件夹内的 BaiduRtcRoom.framework 文件复制到项目文件夹下
- 选择:项目 TARGET -> Build Phases -> Link Binary With Libraries,添加 SDK 动态库文件到项目。
注意动态库须以 Embed & Sign 形式依赖
- xcode 兼容
若出现 Building for iOS, but the linked and embedded framework was built for iOS + iOS Simulator 错误,说明所使用的 xcode 版本默认配置并不直接兼容 framework 形式的动态库,可按以下方式解决:
一、Validate Workspace
在 宿主 xcode build settings 中启用 Validate Workspace,该配置将对 xcode 构建配置做兼容性检测, 但通过此方式解决后,对应的错误会变成⚠️存在。
二、Legacy Build System
若兼容性检测设置未能解决报错问题,可将 xcode 的 Build System 改为 Legacy Build System
Xcode -> File -> Workspace Settings -> Shared Workspace Settings
项目设置
- 打开 Xcode,选择:项目 TARGET -> General -> Deployment Target,设置 9.0 或以上版本。
使用扩展能力模块
BRTC 自 v2.3 开始,拆分或添加部分功能到独立于主产物的扩展模块产物中,
接入方可按需和主产物一起集成,以使用相关能力。
现有扩展模块列表如下,版本列 表示使用该扩展能力时,同时集成的主产物所需满足的最小版本:
名称 | 描述 | 主产品最低要求版本 | 能力 |
---|---|---|---|
BaiduRtcReplayKit | 屏幕分享 | v2.3 | 主产物使用 应用内屏幕分享、系统屏幕分享 能力必须依赖的模块 |
BaiduRtcBeauty | 美颜 | v2.3 | 采集视频前处理美颜,包括美白、磨皮、塑形 等 |
BaiduRtcAudioProcess | 音频处理 | v2.4 | 采集音频前处理,包括 人声变声 等 |
BaiduRtcVideoProcess | 视频处理 | v2.6 | 采集视频水印 等 |
添加相机/麦克风权限
在Info.plist文件中添加Privacy相机/麦克风权限
添加Background Modes
在Target -> Signing & Capabilities -> Background Modes中添加如下Modes
使用美颜采集功能
- 集成美颜扩展模块 BaiduRtcBeauty.framework
- 添加依赖
(V2.6.0 之前版本)
添加 libanakin_lite_static.a,并且TARGET->Build Settings->Other Linker Flags添加-ObjC与-force_load
(V2.6.0 及之后版本)
主工程依赖添加 ProtocolBuffers.framework, ZipArchive.framework
- 添加美颜能力所需资源 bundle
其中 case_bgseg.bundle, case_bgblur.bundle, dlModels.bundle 为 V2.6.0 版本新增
如不需要虚拟背景能力,可不添加 case_bgseg.bundle, case_bgblur.bundle
- 工程配置
(V2.6.0 及之后版本)
若主工程没有 swift 代码,需要配置 swift 环境以供美颜扩展使用:
在工程中创建空 swift 文件,如 RTCEmpty.swift,以使工程执行 swift 编译:
创建空的桥接头文件(创建 swift 文件后 xcode 会自动提示是否进行桥接头配置),如 rtc_ios_sdk-Bridging-Header.h,并在 Build Settings 中做相应配置:
- 使用美颜功能,需要官网申请licenseId与对应的license授权文件,申请步骤如下:
- 进入官网百度智能云,选择短视频SDK
- 选择立即使用,选择license申请,填写项目信息,申请的功能权限,下载SDK
- 或直接进入license申请,选择产品服务->智能视频SDK->选择申请license,填写相关信息,获取license
- 审核成功后,下载对应的license文件,将license文件放入到工程中
- 在AppDelegate.mm中,添加如下代码,将licenseId替换自己申请的
#import <BaiduRtcBeauty/BDCloudAVStreamContext.h>
可参考短视频SDK集成申请license授权。
使用虚拟背景功能
虚拟背景即采集侧前处理虚拟背景,包括自定义背景、背景模糊能力
- 资源依赖:
使用背景模糊能力,需要将 case_bgblur.bundle 添加到主工程
使用自定义背景能力,需要将 case_bgseg.bundle 添加到主工程
替换 bundle 中下图所示的图片资源,以使用自定义背景图
- 接口调用:
参考 API 文档使用 BaiduRtcBeautyManager 的 setHumanSegEnabled:effectParams: 接口使用能力
使用视频处理功能
- 集成视频处理扩展模块 BaiduRtcVideoProcess.framework
- 添加依赖资源:
视频处理使用 Metal 能力,需手动或脚本添加扩展 framework 内部的 BRTCVideoProcess.metallib 到应用主工程中
实现音视频通话
本节介绍如何实现音视频通话。视频通话的 API 调用时序见下图:
代码示例
1.在您的开发项目中导入头文件
#import <BaiduRtcRoom/BaiduRtcRoom.h>
2.定义 rtc room hanlde 变量
@property (nonatomic, strong) BaiduRtcRoomApi *rtcRoomApi;
3.初始化 sdk, 返回 rtc room handle, 初始化的时候要带上 appid,token 串,和 delegate
3.1 内部采集
self.rtcRoomApi = [[BaiduRtcRoomApi alloc] initSDKWithAppID:self.appId
tokenStr:self.tokenStr
delegate:self];
RtcParameterSettings *rps = [[RtcParameterSettings alloc] init];
// hasVideo 和 hasAudio 默认开启,如果需要关闭可以设置为 NO
rps.hasVideo = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_HAS_VIDEO];
rps.hasAudio = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_AUDIO_PARAM_SETTINGS_HAS_AUDIO];
3.2 自定义采集
/**
视频自定义采集
FooCameraCapturer 是您自己的视频源实现类,需要实现 id<BaiduVideoCapturer> 协议。
如果您的视频源是系统相机源,并且想要通过 BRTC 接口实现对相机的部分控制,则需要同时实现 id<BaiduCameraController> 协议
*/
FooCameraCapturer *capturer = [FooCameraCapturer new];
[self.rtcRoomApi setVideoCapturer:capturer];
/**
音频自定义采集
FooAudioExternalDevice 是您自己的音频采集源实现类,需要实现 id<BaiduRtcRoomApiAudioExternalDeviceDelegate> 协议
*/
FooAudioExternalDevice *audioDevice = [[FooAudioExternalDevice alloc] init];
rps.isEnableExternalAudioDevice = YES;
[self.rtcRoom setParamSettings:rps paramType:RTC_AUDIO_PARAM_SETTINGS_DEVICE_MODE];
[self.rtcRoom setAudioExternalDeviceDelegate:audioDevice];
4.音视频参数设置:
// 视频采集参数
RtcVideoBaseParams *captureParams = [[RtcVideoBaseParams alloc] init];
captureParams.videoFps = 15;
captureParams.videoWidth = 720;
captureParams.videoHeight = 1280;
rps.videoCaptureParams = captureParams;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_CAPTURE_PARAMS];
// 视频采集参数 - 前置摄像头
BOOL frontCamera = [[RTCSettingsModel sharedInstance] currentUsingFrontCameraSettingFromStore];
[self.rtcRoomApi setCameraFace:frontCamera];
// 视频编码参数
RtcVideoEncodeParams *videoParams = [[RtcVideoEncodeParams alloc] init];
videoParams.videoFps = 15;
videoParams.videoWidth = 720;
videoParams.videoHeight = 1280;
videoParams.videoBitrate = 1500;
// 屏幕分享视频参数
RtcVideoEncodeParams *screenVideoParams = [[RtcVideoEncodeParams alloc] init];
screenVideoParams.videoFps = 10;
screenVideoParams.videoBitrate = 2000;
screenVideoParams.videoWidth = 1080;
screenVideoParams.videoHeight = 1920;
// 视频编码参数设置
rps.videoEncodeParams = @{
RTC_MEDIA_TARGET_VIDEO_DEFAULT: videoParams,
RTC_MEDIA_TARGET_VIDEO_SCREEN: screenVideoParams
};
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_TARGET_ENCODE_DICT];
- 其他可选音视频配置
// 设置切后台视频流推流模式
rps.videoBgPushMode = BRTC_VIDEO_BG_PUSH_LASTFRAME;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_PARAM_SETTINGS_VIDEO_BG_PUSH_MODE];
// 音频场景
BRTCAudioProfileType audioProfile = BRTC_AUDIO_PROFILE_HIGH_QUALITY;
BRTCAudioScenario audioScenario = BRTC_AUDIO_SCENARIO_DEFAULT;
[self.rtcRoomApi setAudioProfile:audioProfile scenrio:audioScenario];
// 使用外部渲染,外部渲染远端视频画面。若 enable 外部渲染,需实现 BaiduRtcApiRenderDelegate protocol, 并通过 setRenderDelegate 设置给 SDK.
rps.isEnableExternalRender = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_RENDER_MODE];
// 使用声音录制, 连麦时混合后的声音抛给用户处理。若 enable 本地采集和远端声音混功能,需实现 BaiduRtcApiAudioRecordDelegate protocol, 并通过 setAudioRecordDelegate 设置给 SDK
rps.isExportAudioRecordPlayoutMix = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_AUDIO_PARAM_SETTINGS_EXPORT_RECORD_PLAYOUT_MIX];
- 媒体流设置
//是否自动发布流。默认开启,若不需要自动推流可设置为 NO
rps.isAutoPublish = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_PARAM_SETTINGS_AUTO_PUBLISH];
//是否自动订阅流。默认开启,若不需要自动拉流可设置为 NO
rps.isAutoSubscribe = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_PARAM_SETTINGS_AUTO_SUBSCRIBE];
- 视频显示 view 设置
// 设置本地视频显示view
[self.rtcRoomApi setLocalDisplay:_videoCallView.localVideoView];
// 是否开启多人模式(YES:多人模式;NO:两人模式)
rps.isMultiPlayerModel = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_SESSION_MODE];
// 设置远端用户视频显示view
//当多人模式 rps.isMultiPlayerModel = NO 时,通过此方法设置远端画面
[self.rtcRoomApi setRemoteDisplay:self.remoteView];
/**
当多人模式rps.isMultiPlayerModel = YES时,在BaiduRtcRoomDelegate代理回调里通过以下方法设置远端画面。
[self.rtcRoomApi setRemoteDisplay:videoInfo.videoView userId:rtcStreamInfo.userId];
*/
- 登录房间
uint32_t tempUserId = [self getRandomNumber:1000 to:9000];
[self.rtcRoomApi loginRtcRoomWithRoomName:self.roomName
userID:tempUserId
displayName:@"James"];
- 发布流
// 不自动发布流时,可使用该方法推流
// 注意需要等待加入房间成功,即代理方法onRoomEventUpdate回调RTC_ROOM_EVENTS_ROOM_JOINED事件之后调用
[self.rtcRoomApi publishStreaming];
- 登出房间,结束音视频通话
[self.rtcRoomApi logoutRtcRoom];