iOS用百度的api实现rtmp推流

作者: yxy旧时光 | 来源:发表于2016-08-20 10:39 被阅读743次

    集成百度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推流

        本文链接:https://www.haomeiwen.com/subject/pehisttx.html