推流-SDK-开发指南
准备工作
- 开通 百度智能云音视频直播服务,添加推拉流域名并获取推流地址及观看地址。
- 登录百度智能云官网,在安全认证页面 获取 AK/SK。
- 下载最新的iOS 端推流 SDK。
- 准备 iOS 运行环境:iOS 8.0 及以上的所有系统。
- Xcode版本:推荐使用Xcode 8.1。
- 适配 CPU 指令集:armv7/armv7s、arm64、i386/x86_64。
-
项目配置:
(1) 支持cocoapods接入方式,具体请参见Github百度开发云页面。
(2) 将Baidu-Capture-SDK-iOS-x.x.x/sdk 目录下的 VideoCore.framework 添加到 Xcode 工程。
(3) 添加 VideoCore.framework 到 Embed Frameworks 中。
如下图所示:
### 初始化 VCSimpleSession
推荐使用 VCSimpleSessionConfiguration 类来进行初始化(原有的初始化接口已被废弃,在未来的版本中将被删除),具体用法请参考如下代码段:
1 VCSimpleSessionConfiguration* configuration = [[VCSimpleSessionConfiguration alloc] init];
2 configuration.cameraOrientation = AVCaptureVideoOrientationPortrait;
3 configuration.videoSize = CGSizeMake(720, 1280);
4 configuration.bitrate = 1200 * 1000;
5 configuration.cameraDevice = VCCameraStateFront;
6 ...
7
8 self.session = [[VCSimpleSession alloc] initWithConfiguration:configuration];
参数详情请参见参数控制。
## 开始推流
初始化成功后,可以通过 startRtmpSessionWithURL 方法设置推流地址并开始推流。
以下示例代码使用 startRtmpSessionWithURL 设置推流路径并开始推流,推流 URL 的具体值为:
rtmp://push.bj.bcelive.com/live/fjqgewdr17gqnuje235
。
1[session startRtmpSessionWithURL:@"rtmp://push.bj.bcelive.com/live/" andStreamKey:@"fjqgewdr17gqnuje235"];
2或者
3[session startRtmpSessionWithURL:@"rtmp://push.bj.bcelive.com/live/fjqgewdr17gqnuje235"];
## 结束推流
开始推流成功后,您随时可以结束推流。
以下示例代码使用 endRtmpSession 结束推流。
1[session endRtmpSession];
## 监听推流过程中的通知(v2.0.0版本后失效)
-
侦听 name 为 RTMP_Started 的系统消息以获取推流开始的事件
示例代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRTMPStartedMessage:) name:RTMP_Started object:nil];
(void) handleRTMPStartedMessage:(NSNotification*)notification { NSLog(@"RTMP Streaming was started..\n"); }
-
侦听 name 为 RTMP_Error 的系统消息以获取推流异常的事件
示例代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRTMPErrorMessage:) name:RTMP_Error object:nil];
(void) handleRTMPErrorMessage:(NSNotification*)notification { NSLog(@"Error occurred in Streaming..\n"); }
注意:在收到 RTMP_Started 消息之前,请勿调用 endRtmpSession,否则将造成资源释放异常。推荐侦听状态变化事件代替通知事件。
## 处理推流 SDK 状态变化事件
在 VCSimpleSession 接口中,您可以通过实现名为 VCSessionDelegate 的 protocol,实时接收到推流 SDK 的一些属性及状态更新信息,其中 onError 接口用于在发生错误时通知用户。
protocol 定义如下:
1@protocol VCSessionDelegate <NSObject>
2@required
3- (void) connectionStatusChanged: (VCSessionState) sessionState;
4@optional
5- (void) didAddCameraSource:(VCSimpleSession*)session;
6- (void) onError:(VCErrorCode)error;
7@end
以下示例代码演示了如何实现 protocol 对 session 状态变化事件进行处理:
1- (void) connectionStatusChanged:(VCSessionState) state
2{
3 switch(state) {
4 case VCSessionStateStarting:
5 NSLog(@"Current state is VCSessionStateStarting\n");
6 [self.btnConnect setImage:[UIImage imageNamed:@"block.png"] forState:UIControlStateNormal];
7 break;
8 case VCSessionStateStarted:
9 NSLog(@"Current state is VCSessionStateStarted\n");
10 [self.btnConnect setImage:[UIImage imageNamed:@"to_stop.png"] forState:UIControlStateNormal];
11 break;
12 case VCSessionStateError:
13 NSLog(@"Current state is VCSessionStateError\n");
14 [self.btnConnect setImage:[UIImage imageNamed:@"to_start.png"] forState:UIControlStateNormal];
15 break;
16 default:
17 NSLog(@"Current state is VCSessionStateEnded\n");
18 [self.btnConnect setImage:[UIImage imageNamed:@"to_start.png"] forState:UIControlStateNormal];
19 break;
20 }
21}
注意:在 protocol 定义中,connectionStatusChanged 为必选方法,当推流 SDK 状态发生改变时,该方法会被调用,参数 sessionState 即为当前推流 session 所处的状态。
sessionState 参数为 VCSessionState 类型,定义如下:
1typedef NS_ENUM(NSInteger, VCSessionState)
2{
3 VCSessionStateNone, //推流 SDK 的初始状态
4 VCSessionStatePreviewStarted, //推流 SDK 开始出现预览画面
5 VCSessionStateStarting, //推流 SDK 开始连接服务器
6 VCSessionStateStarted, //推流已经开始
7 VCSessionStateEnded, //推流已经结束
8 VCSessionStateError //推流 SDK 出错
9};
在状态 VCSessionStateStarting 与 VCSessionStateStarted 之间,推流 SDK 正在后台连接 RTMP 服务器,此时请勿对 VCSimpleSession 对象进行任何操作,特别是请勿调用 endRtmpSession,否则将造成资源释放异常。状态变为 VCSessionStatePreviewStarted 后,方可使用美颜接口开启美颜功能。
其中,didAddCameraSource 为可选方法。
当推流 SDK 创建 CameraSource(即相机被占用)后,didAddCameraSource 方法会被调用,参数 session 为 VCSimpleSession 对象。
## 使用美颜功能
当推流 SDK 的状态变为 VCSessionStatePreviewStarted 时,可以使用 setBeatyEffect 和 enableBeautyEffect 两个接口设置美颜效果。
-
设置美颜级别 beautyLevel: 预设美颜的一些参数,分为5个级别:
Plain Text1 /** 2 * @brief 美颜级别定义 3 */ 4 typedef NS_ENUM(NSInteger, VCBeautyLevel) { 5 /** 6 * 不开启美颜。 7 */ 8 VCBeautyLevelNone, 9 /** 10 * 自然。基本去皱,适当美白提亮 11 */ 12 VCBeautyLevelNatural, 13 /** 14 * 美白。去皱但不失真,以美白为主粉嫩为辅 15 */ 16 VCBeautyLevelWhiten, 17 /** 18 * 粉嫩。去皱但不失真,以粉嫩为主美白为辅 19 */ 20 VCBeautyLevelPink, 21 /** 22 * 梦幻。最大值 23 */ 24 VCBeautyLevelMagic 25 };
-
设置具体的美颜参数 setBeatyEffect:用于设置美颜效果,参数为 0 表示没有效果,参数为 1 表示最大效果。调用该接口后美颜效果会立即生效,无需再次调用 enableBeautyEffect。接口定义如下:
Plain Text1 /** 2 * 设置美颜参数 3 * bright 美白参数,取值范围[0, 1] 4 * smooth 磨皮参数,取值范围[0, 1] 5 * pink 粉嫩参数,取值范围[0, 1] 6 */ 7 - (void) setBeatyEffect:(float) bright 8 withSmooth:(float) smooth 9 withPink:(float) pink;
-
enableBeautyEffect:用于开启或关闭美颜效果。开启前若未使用 setBeatyEffect 接口设置过美颜参数,则使用默认美颜参数;否则使用最近设置的美颜参数。接口定义如下:
Plain Text1 // 开启或关闭美颜效果 2 - (void) enableBeautyEffect:(BOOL) isEnable;
## 参数控制
推流 SDK 提供丰富的参数供您灵活控制推流过程中的音视频效果,详情如下:
参数名 | 参数类型 | 含义 | 推流后是否可变 | 默认值 | 取值范围 |
---|---|---|---|---|---|
videoSize | CGSize | 视频分辨率 | 否 | 无(必须初始化) | 宽高均大于0 |
bitrate | int | 视频编码码率(单位为bps) | 否 | 无(必须初始化) | 大于100000 |
fps | int | 视频采集帧率 | 否 | 无(必须初始化) | 大于1,小于等于30 |
useInterfaceOrientation | BOOL | 是否使用应用的竖直方向作为视频的竖直方向 | 否 | NO | YES, NO |
cameraState | VCCameraState | 视频采集所用摄像头种类 | 是(调用 switchCamera) | VCCameraStateBack | VCCameraStateFront, VCCameraStateBack |
orientationLocked | BOOL | 是否锁定视频正方向 | 是 | YES | YES, NO |
torch | BOOL | 是否开启闪光灯 | 是 | NO | YES, NO |
videoZoomFactor | float | 视频缩放比例 | 是 | 1.0 | 大于0,小于等于1.0 |
audioChannelCount | int | 音频采集编码过程中所使用的声道数 | 否 | 2 | 1, 2 |
audioSampleRate | float | 音频采集编码过程中所使用的采样率 | 否 | 44100.0 | 44100.0, 22050.0 |
micGain | float | 音量增益因子 | 是 | 1.0 | 大于等于0,小于等于1.0 |
focusPointOfInterest | CGPoint | 自动对焦时摄像头的对焦焦点 | 是 | (0.5, 0.5) | (0, 0)到(1, 1),(0, 0)表示左上角,(1, 1)表示右下角 |
exposurePointOfInterest | CGPoint | 摄像头的测光中心点 | 是 | (0.5, 0.5) | (0, 0)到(1, 1),(0, 0)表示左上角,(1, 1)表示右下角 |
continuousAutofocus | BOOL | 是否开启自动对焦 | 是 | YES | YES, NO |
continuousExposure | BOOL | 是否开启动态测光 | 是 | YES | YES, NO |
useAdaptiveBitrate | BOOL | 是否开启可变码率选项(暂不支持) | 否 | NO | YES, NO |
aspectMode | VCAspectMode | 视频画面对窗口的填充方式 | 是 | VCAspectModeFit | VCAspectModeFit, VCAscpectModeFill |
filter | VCFilter | 实时滤镜效果 | 是 | VCFilterNormal | VCFilterNormal, VCFilterGray, VCFilterInvertColors, VCFilterSepia, VCFilterFisheye, VCFilterGlow, VCFilterGussBlur |