iOS 快速接入
iOS 快速实现音视频通话
实时音视频通话能够拉近人与人之间的距离,帮助你的 APP 提高用户黏性。 本文介绍如何通过少量代码集成百度 RTC SDK ,快速实现高质量、低延迟的视频通话功能。
实现视频通话的步骤如下:
- 初始化
调用 initWithAppID初始化SDK
2.设置显示视图
设置本地与远端显示视图
3.加入房间
调用loginRtcRoomWithRoomName 加入房间
说明:在 APP ID 一致的前提下,传入相同房间名的用户会进入同一个房间通话。
4.发布/订阅
加入房间后,两位主播可以手动发布音视频并互相订阅
如果设置自动发布 或 自动订阅 ,则自动发布/订阅音视频
5.退出房间
挂断,退出房间
视频通话的 API 调用时序见下图:
前期准备
- Xcode 9.0 或以上版本
- 支持 iOS 9.0 或以上版本的 iOS 设备
- 两台支持音视频功能的模拟器或真机
- 申请百度智能云官网 APP ID,详见https://cloud.baidu.com/product/rtc.html
- 下载精简SDK https://doc.bce.baidu.com/bce-documentation/RTC/rtc_iOS_release_fastdemo_20230407.zip
- 或下载SDK https://cloud.baidu.com/doc/RTC/s/Hk29sqi42
- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙,否则无法正常使用百度服务。
在 Xcode 中进行以下操作,在你的 app 中实现视频通话功能:
- 创建一个新的项目,Application 选择 App,Interface 选择 Storyboard,Language 选择 Objective_C。如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,点击 Next,完成后即可选择你的 Apple 账户作为开发团队。
- 为你的项目设置自动签名。
- 设置部署你的 app 的目标设备。
说明:使用已有的项目也可以集成SDK。
项目设置
- 打开 Xcode,选择:项目 TARGET -> General -> Deployment Target,设置 9.0 或以上版本。
添加 SDK 静态库文件
- 将下载的SDK中lib文件夹内的文件复制到项目文件夹下
- 选择:项目 TARGET -> Build Phases ->Link Binary With Libraries,将 BaiduRtcRoom.framework SocketRocket.framework添加 SDK 静态库文件到项目。
- 选择:项目 TARGET -> Build Phases ->Link Binary With Libraries,将libyuv.a,libcrypto.a,libssl.a添加到项目中
添加系统依赖库
将系统库libc++.tbd,libnetwork.tbd,libicucore.A.tbd,WebKit.framework,VideoToolbox.framework,GLKit.framework添加到项目中
说明 :
BaiduRtcRoom 为 BRTC SDK 主依赖库,必须添加;
SocketRocket 为三方依赖库,必须添加;
其中libyuv.a,libcrypto.a,libssl.a为百度内部依赖库,必须添加;
其余为系统依赖库,必须添加。
添加相机/麦克风权限
在Info.plist文件中添加Privacy相机/麦克风权限
添加Background Modes
在Target -> Signing & Capabilities -> Background Modes中添加如下Modes
代码示例
1.以新建项目为例,在ViewController.m文件中导入头文件
#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];
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.音视频参数设置:
RtcParameterSettings *rps = [[RtcParameterSettings alloc] init];
//是否开启多人模式(YES:多人模式;NO:两人模式)
rps.isMultiPlayerModel = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_SESSION_MODE];
//以下参数按需设置
// 视频采集参数
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 = YES;
[self.rtcRoomApi setCameraFace:frontCamera];
// 视频编码参数
RtcVideoEncodeParams *videoParams = [[RtcVideoEncodeParams alloc] init];
videoParams.videoFps = 15;
videoParams.videoWidth = 720;
videoParams.videoHeight = 1280;
videoParams.videoBitrate = 1500;
// 视频编码参数设置
rps.videoEncodeParams = @{
RTC_MEDIA_TARGET_VIDEO_DEFAULT: videoParams,
};
[self.rtcRoomApi setParamSettings:rps paramType:RTC_VIDEO_PARAM_SETTINGS_TARGET_ENCODE_DICT];
//是否自动发布流
rps.isAutoPublish = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_PARAM_SETTINGS_AUTO_PUBLISH];
//是否自动订阅流
rps.isAutoSubscribe = YES;
[self.rtcRoomApi setParamSettings:rps paramType:RTC_PARAM_SETTINGS_AUTO_SUBSCRIBE];
5.视频显示 view 设置
@interface ViewController () <
BaiduRtcRoomDelegate, RTCRemoteVideoViewDelegate
>
@property (nonatomic, strong) BaiduRtcRoomApi *rtcRoomApi;
//声明本地与远端用户显示的视图
@property (nonatomic, strong) RTCLocalVideoView *localView;
@property (nonatomic, strong) RTCRemoteVideoView *remoteView;
@end
- (void)viewDidLoad {
//初始化本地用户显示视图
self.localView = [[RTCLocalVideoView alloc] initWithDelegate:self];
self.localView.videoView.frame = CGRectMake(0, 0, 100, 200);
[self.view addSubview:self.localView.videoView];
//初始化远端用户显示视图
self.remoteView = [[RTCRemoteVideoView alloc] initWithDelegate:self];
self.remoteView.videoView.frame = CGRectMake(0, 120, 100, 200);
[self.view addSubview:self.remoteView.videoView];
//设置本地视频显示view
[self.rtcRoomApi setLocalDisplay:self.localView];
//设置远端用户视频显示view
//当多人模式rps.isMultiPlayerModel = NO时,通过此方法设置远端画面
[self.rtcRoomApi setRemoteDisplay:self.remoteView];
/**
当多人模式rps.isMultiPlayerModel = YES时,在BaiduRtcRoomDelegate代理回调里通过以下方法设置远端画面。
可以在提供的demo里面搜索此方法
[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];
- 订阅流
// 不自动订阅流时,可使用该方法拉流
// 注意需要等待加入房间成功,即代理方法onRoomEventUpdate回调RTC_ROOM_EVENTS_ROOM_JOINED事件之后调用
[self.rtcRoomApi subsribeStreaming:@[@(123)]];
- 登出房间,结束音视频通话
[self.rtcRoomApi logoutRtcRoom];