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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • 推流,就是将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。 推流前的工作:采集,处理,编码压缩 推流中做...
    木马不在转阅读 7,392评论 13 30
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,979评论 25 707
  • 刘溪,远大住工国际;国学践行23期学员,24、25期奉献者,六项精进299期家人 【日精进第81天】 《六项精进》...
    西西_3e45阅读 240评论 0 0
  • 最近向朋友做了一个关于唐伯虎的小调查:你知道唐伯虎是一个怎么样的人吗? 得到的答案如下: 某女1:他好像画过画,春...
    南方的桥阅读 1,499评论 20 24