集成百度SDK注意事项:
•下载百度iOS端推流SDK。
•准备iOS运行环境:iOS 7.0及以上的所有系统。
•适配CPU指令集:armv6、armv7/armv7s、arm64、i386/x86_64。
添加依赖:(1)将Baidu-Capture-SDK-iOS-x.x.x/lib目录下的头文件VCSimpleSession.h添加到Xcode工程。(2)添加推流SDK所依赖的iOS框架,视频编解码API (VideoToolbox.framework)及压缩工具(libz.1.1.3.dylib或libz.1.1.3.tbd)。(3)添加推流SDK的静态库文件:使用真机调试、发布,须添加Baidu-Capture-SDK-iOS-x.x.x/lib/arm目录下所列静态库;使用模拟器调试、发布,则添加Baidu-Capture-SDK-iOS-x.x.x/lib/x86目录下所列静态库。(注意,使用模拟机和真机一定要添加对应的静态库)在Xcode中将这些框架和SDK的静态库文件添加到用户的工程里。
调用推流SDK中已封装的API进行开发:
1、初始化VCSimpleSession
推流SDK提供如下四种方法完成初始化:
•(1)
initWithVideoSize:(CGSize)videoSize frameRate:(int)fpsbitrate:(int)bps;
VCSimpleSession *session = [VCSimpleSession alloc];
[session initWithVideoSize:CGSizeMake(720, 1280) frameRate:20 bitrate:1024000];
•(2)
initWithVideoSize:(CGSize)videoSize frameRate:(int)fpsbitrate:(int)bps useInterfaceOrientation:(BOOL)useInterfaceOrientation;
VCSimpleSession *session = [VCSimpleSession alloc];
[session initWithVideoSize:CGSizeMake(720, 1280) frameRate:20 bitrate:1024000 useInterfaceOrientation:YES];
•(3)
initWithVideoSize:(CGSize)videoSize frameRate:(int)fpsbitrate:(int)bps useInterfaceOrientation:(BOOL)useInterfaceOrientationcameraState:(VCCameraState) cameraState;
VCSimpleSession *session = [VCSimpleSession alloc];
VCCameraState camState = VCCameraStateFront;
[session initWithVideoSize:CGSizeMake(720, 1280) frameRate:20 bitrate:1024000 useInterfaceOrientation:YES cameraState:camState];
•(4)
initWithVideoSize:(CGSize)videoSize frameRate:(int)fpsbitrate:(int)bps useInterfaceOrientation:(BOOL)useInterfaceOrientation cameraState:(VCCameraState)cameraState aspectMode:(VCAspectMode) aspectMode;
VCSimpleSession *session = [VCSimpleSession alloc];
VCCameraState camState = VCCameraStateFront;
[session initWithVideoSize:CGSizeMake(720, 1280) frameRate:20 bitrate:1024000 useInterfaceOrientation:YES cameraState:camState aspectMode:aspectMode];
2、开始推流
初始化成功后,可以通过startRtmpSessionWithURL方法设置推流地址并开始推流。
以下示例代码使用startRtmpSessionWithURL设置推流路径并开始推流,推流URL的具体值为:
rtmp://192.168.1.177:1935/zqnblive/zqnb/177_film。
[session startRtmpSessionWithURL:@"rtmp://192.168.1.177:1935/zqnblive/zqnb/" andStreamKey:@"177_film"];
注意:rtmp推流的地址一般格式为rtmp://{IP:PORT}/{Application}/{Channel}/{Stream},这个方法第一个参数就是rtmp://{IP:PORT}/{Application}/{Channel},第二个参数andStreamKey对应的就是{Stream}。
3、结束推流
开始推流成功后,您随时可以结束推流。
以下示例代码使用endRtmpSession结束推流。
[session endRtmpSession];
4、监听推流过程中的通知
•侦听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,否则将造成资源释放异常。
5、处理推流SDK状态变化事件
在VCSimpleSession接口中,您可以通过实现名为VCSessionDelegate的protocol,实时接收到推流SDK的一些属性及状态更新信息。
protocol定义如下:
@protocol VCSessionDelegate
@required
- (void) connectionStatusChanged: (VCSessionState) sessionState;
@optional
- (void) didAddCameraSource:(VCSimpleSession*)session;
@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对象进行任何操作。
其中,didAddCameraSource为可选方法。
当推流SDK创建CameraSource(即相机被占用)后,didAddCameraSource方法会被调用,参数session为VCSimpleSession对象。
在这里和大家分享一下我集成的过程中遇到的问题:
1、所有的关于静态库的地方都报错,你会发现有几十个bug,这个时候不妨添加libc++这个类库试试看,这个是由于静态库中运用了c与oc混编。
2、No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS这个错误
3、_OBJC_CLASS_$_某文件名", referenced from:,遇到这个问题也分为几个情况
(1).m文件没有导入在Build Phases里的Compile Sources中添加报错的文件
(2).framework文件没有导入静态库编译时往往需要一些库的支持,查看你是否有没有导入的库文件,同样是在Build Phases里的Link Binary With Libraries中添加
(3)重复编译,可能你之前复制过两个地方,在这里添加过两次,删除时系统没有默认删除编译引用地址,在Build Settings里搜索Search Paths将里面Library Search Paths中没有用到的地址删除
(4)最后一个问题,出在静态库生成上面。系统编译生成的静态库有两个,一个真机调用的,一个模拟器调用的。当你在真机测试时导入模拟器静态库,运行就会报错;同样在模拟器测试时调用真机静态库也会报错。也可以将两个静态库合并,生成一个兼容的静态库。