推流-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 类来进行初始化(原有的初始化接口已被废弃,在未来的版本中将被删除),具体用法请参考如下代码段:
VCSimpleSessionConfiguration* configuration = [[VCSimpleSessionConfiguration alloc] init];
configuration.cameraOrientation = AVCaptureVideoOrientationPortrait;
configuration.videoSize = CGSizeMake(720, 1280);
configuration.bitrate = 1200 * 1000;
configuration.cameraDevice = VCCameraStateFront;
...
self.session = [[VCSimpleSession alloc] initWithConfiguration:configuration];
参数详情请参见参数控制。
## 开始推流
初始化成功后,可以通过 startRtmpSessionWithURL 方法设置推流地址并开始推流。
以下示例代码使用 startRtmpSessionWithURL 设置推流路径并开始推流,推流 URL 的具体值为:
rtmp://push.bj.bcelive.com/live/fjqgewdr17gqnuje235
。
[session startRtmpSessionWithURL:@"rtmp://push.bj.bcelive.com/live/" andStreamKey:@"fjqgewdr17gqnuje235"];
或者
[session startRtmpSessionWithURL:@"rtmp://push.bj.bcelive.com/live/fjqgewdr17gqnuje235"];
## 结束推流
开始推流成功后,您随时可以结束推流。
以下示例代码使用 endRtmpSession 结束推流。
[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 定义如下:
@protocol VCSessionDelegate <NSObject>
@required
- (void) connectionStatusChanged: (VCSessionState) sessionState;
@optional
- (void) didAddCameraSource:(VCSimpleSession*)session;
- (void) onError:(VCErrorCode)error;
@end
以下示例代码演示了如何实现 protocol 对 session 状态变化事件进行处理:
- (void) connectionStatusChanged:(VCSessionState) state
{
switch(state) {
case VCSessionStateStarting:
NSLog(@"Current state is VCSessionStateStarting\n");
[self.btnConnect setImage:[UIImage imageNamed:@"block.png"] forState:UIControlStateNormal];
break;
case VCSessionStateStarted:
NSLog(@"Current state is VCSessionStateStarted\n");
[self.btnConnect setImage:[UIImage imageNamed:@"to_stop.png"] forState:UIControlStateNormal];
break;
case VCSessionStateError:
NSLog(@"Current state is VCSessionStateError\n");
[self.btnConnect setImage:[UIImage imageNamed:@"to_start.png"] forState:UIControlStateNormal];
break;
default:
NSLog(@"Current state is VCSessionStateEnded\n");
[self.btnConnect setImage:[UIImage imageNamed:@"to_start.png"] forState:UIControlStateNormal];
break;
}
}
注意:在 protocol 定义中,connectionStatusChanged 为必选方法,当推流 SDK 状态发生改变时,该方法会被调用,参数 sessionState 即为当前推流 session 所处的状态。
sessionState 参数为 VCSessionState 类型,定义如下:
typedef NS_ENUM(NSInteger, VCSessionState)
{
VCSessionStateNone, //推流 SDK 的初始状态
VCSessionStatePreviewStarted, //推流 SDK 开始出现预览画面
VCSessionStateStarting, //推流 SDK 开始连接服务器
VCSessionStateStarted, //推流已经开始
VCSessionStateEnded, //推流已经结束
VCSessionStateError //推流 SDK 出错
};
在状态 VCSessionStateStarting 与 VCSessionStateStarted 之间,推流 SDK 正在后台连接 RTMP 服务器,此时请勿对 VCSimpleSession 对象进行任何操作,特别是请勿调用 endRtmpSession,否则将造成资源释放异常。状态变为 VCSessionStatePreviewStarted 后,方可使用美颜接口开启美颜功能。
其中,didAddCameraSource 为可选方法。
当推流 SDK 创建 CameraSource(即相机被占用)后,didAddCameraSource 方法会被调用,参数 session 为 VCSimpleSession 对象。
## 使用美颜功能
当推流 SDK 的状态变为 VCSessionStatePreviewStarted 时,可以使用 setBeatyEffect 和 enableBeautyEffect 两个接口设置美颜效果。
-
设置美颜级别 beautyLevel: 预设美颜的一些参数,分为5个级别:
/** * @brief 美颜级别定义 */ typedef NS_ENUM(NSInteger, VCBeautyLevel) { /** * 不开启美颜。 */ VCBeautyLevelNone, /** * 自然。基本去皱,适当美白提亮 */ VCBeautyLevelNatural, /** * 美白。去皱但不失真,以美白为主粉嫩为辅 */ VCBeautyLevelWhiten, /** * 粉嫩。去皱但不失真,以粉嫩为主美白为辅 */ VCBeautyLevelPink, /** * 梦幻。最大值 */ VCBeautyLevelMagic };
-
设置具体的美颜参数 setBeatyEffect:用于设置美颜效果,参数为 0 表示没有效果,参数为 1 表示最大效果。调用该接口后美颜效果会立即生效,无需再次调用 enableBeautyEffect。接口定义如下:
/** * 设置美颜参数 * bright 美白参数,取值范围[0, 1] * smooth 磨皮参数,取值范围[0, 1] * pink 粉嫩参数,取值范围[0, 1] */ - (void) setBeatyEffect:(float) bright withSmooth:(float) smooth withPink:(float) pink;
-
enableBeautyEffect:用于开启或关闭美颜效果。开启前若未使用 setBeatyEffect 接口设置过美颜参数,则使用默认美颜参数;否则使用最近设置的美颜参数。接口定义如下:
// 开启或关闭美颜效果 - (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 |