iOS用百度的api实现rtmp推流

集成百度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)最后一个问题,出在静态库生成上面。系统编译生成的静态库有两个,一个真机调用的,一个模拟器调用的。当你在真机测试时导入模拟器静态库,运行就会报错;同样在模拟器测试时调用真机静态库也会报错。也可以将两个静态库合并,生成一个兼容的静态库。

你可能感兴趣的:(iOS用百度的api实现rtmp推流)