1 概念说明

直播:直播的视频源是用户实时推送的。因此,用户停止推送后,播放端的画面也会随即停止,而且由于是实时直播,所以播放器在播直播的时候是没有进度条的。

推流:是指将音视频数据采集编码之后,推送到微吼云平台。微吼云 SDK 主要帮您解决在智能手机上的推流问题,它的接口非常简单易用。

2 接入准备

2.1 成为开发者

申请开通微吼云账号,提供用户资料,微吼服务人员在后台为用户开通平台账号,用户也可自行在官网进行账号注册,账号开通后,用户即可登录,成为一名开发者。

2.2 创建应用

登录微吼云平台后,控制台选择应用管理,进入应用管理页面点击创建应用,根据页面提示信息,完成应用创建。应用创建完成,您可以在控制台界面找到在应用管理界面您可以找到 AppID。

2.3 添加服务

应用创建完成后,默认开通直播服务,在直播服务下直播管理的【直播配置】页面查看AppID

2.4 SDK下载

SDK下载

3 工程配置

3.1 支持平台

  • SDK支持iOS 8.0以上系统

3.2 开发环境

  • Xcode 8或更高版本
  • OS X 10.10或更高版本

3.3 Xcode工程设置

下面通过一个简单的iOS Application工程,说明如和在Xcode工程中配置SDK。

3.3.1 拷贝SDK文件

在本例中,新建一个名字叫做VHSDKDemo的iOS工程,将下载下来的文件夹拷贝至工程目录。目录结构如下图所示:

3.3.2 添加库和Framework

libc++.tbd
libz2.1.0.tbd
libicucore.tbd
libz.tbd
libiconv.tbd
CoreTelephony.framework
MediaPlayer.framework
AVFoundation.framework
VideoToolbox.framework
AssetsLibrary.framework
OpenAL.framework
OpenGLES.framework
QuartzCore.framework
CoreMedia.framework
Security.framework

3.3.3 工程设置修改

  • AppDelegate.m 文件名修改为AppDelegate.mm
  • Build Setting 中 Enable Bitcode 设置为NO
  • 设置Info.plist中 App Transport Security Settings -> Allow Arbitrary Loads 设置为 YES
  • 设置Info.pplist中 Privacy - Camera Usage Description 是否允许使用相机
  • 设置Info.pplist中 Privacy - Microphone Usage Description 是否允许使用麦克风

3.4 验证

下面在VHSDKDemo的代码中,调用SDK的接口,设置appID 获取SDK版本信息,以验证工程设置是否正确。

3.4.1 引用头文件

在AppDelegate.mm开头引用SDK的头文件:

#import "VHLiveBase.h"

3.4.2 添加调用代码

在application: didFinishLaunchingWithOptions:方法中添加代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [VHLiveBase registerApp:@"xxxxxxxxx"];//AppID:xxxxxxxxx
    [VHLiveBase setThirdPartyUserId:@"xxxxxxxx"];//第三方账号id:xxxxxxxx
    NSLog(@"SDK Version: %@",[VHLiveBase getSDKVersion]);
    return YES;
}

3.4.3 编译运行

如果前面各个步骤都操作正确的话,VHSDKDemo工程应该可以顺利编译通过。在Debug模式下运行APP,Xcode的Console窗格会打印出SDK的版本信息。

至此,工程配置完成。

4 注册APP

[VHLiveBase registerApp:@"xxxxxxxxx"];//AppID:xxxxxxxxx

5 设置第三方ID

[VHLiveBase setThirdPartyUserId:@"xxxxxxxx"];//第三方账号id:xxxxxxxx

6 LOG打印

在 VHLiveBase 中可以设置 log的级别,具体代码如下:

[VHLiveBase setLogLevel:VHLogLevelDebug];

7 获取roomID、access_token

获取roomIDaccess_token

8 代码对接

8.1 创建Publisher对象

先创建一个 Publisher 对象,我们后面主要用它来完成推流工作。

不过在创建 Publisher 对象之前,还需要您指定一个VHPublishConfig对象,该对象的用途是决定 Publisher 推流时各个环节的配置参数,比如推流用多大的分辨率、每秒钟要多少帧画面(FPS)等等。

VHPublishConfig 在configWithType之后便已经装配了一些我们反复调过的参数,如果您不需要自己定制这些配置,塞给Publisher对象就可以了。如果您有相关领域的经验基础,需要对这些默认配置进行调整,可以阅读进阶篇中的内容。

    // 创建 LivePushConfig 对象,该对象默认初始化为基础配置
    VHPublishConfig* config = [VHPublishConfig configWithType:VHPublishConfigTypeDefault];
    //在 config中您可以对推流的参数(如:前后置摄像头、分辨率、帧率,横竖屏推流等)做一些初始化操作,需要注意 config不能为nil
    _publisher = [[VHLivePublisher alloc] initWithConfig: config];

8.2 设置并启动预览画面、delegate

  • delegate 推流事件代理
  • startCapture 启动手机摄像头采集画面,并将画面渲染到屏幕上。
    _publisher.delegate            = self;
    _publisher.preView.frame = _perView.bounds;
    [self.perView insertSubview:_publisher.preView atIndex:0];
    //开始视频采集、并显示预览界面
    [_publisher startCapture];

8.3 开始推流

经过 step1 和 step2 的准备之后,用下面这段代码就可以启动推流了:

  • roomId 推流房间id 可以通过调用 api 创建
  • accessToken 可以通过调用 api 获得
    NSString* roomId = @"lss_xxxxxx";
    NSString* accessToken = @"xxxxxxxxxx";
    [_publisher startPublish:roomId accessToken:accessToken];

8.4 切换前置或后置摄像头

默认是使用后置摄像头(可以通过修改 VHPublishConfig 的配置项 captureDevicePosition 来修改这个默认值),调用一次switchCamera 切换一次,注意切换摄像头前必须保证 VHPublishConfig 和 VHLivePublisher 对象都已经初始化。

// 默认是前置摄像头,可以通过修改 LivePushConfig 的配置项 frontCamera 来修改这个默认值
[_publisher switchCamera:AVCaptureDevicePositionBack];//AVCaptureDevicePositionFront

8.5 打开或关闭闪光灯

只有后置摄像头才可以打开闪光灯,另外该接口需要在启动预览之后调用

// 默认是前置摄像头,可以通过修改 LivePushConfig 的配置项 frontCamera 来修改这个默认值
if(!frontCamera) {
    BOOL bEnable = YES;
    //bEnable为YES,打开闪光灯; bEnable为NO,关闭闪光灯
    BOOL result = [_publisher torchMode: bEnable];
    //result为YES,打开成功;result为NO,打开失败
}

8.6 手动对焦

对焦点 [x,y] 取值范围[0.0 - 1.0]

// 手动对焦 point 对焦点 [x,y] [0.0 - 1.0]
 - (BOOL)focusCameraAtAdjustedPoint:(CGPoint)point;

8.7 变焦

变焦取值范围[1.0 - xx] xx 是系统相机支持最大变焦值

//变焦
 - (BOOL)zoomCamera:(CGFloat)zoomSize;

8.8 APP 切入后台

常规模式下,App一旦切到后台,摄像头的采集能力就会被 iOS 暂时停止掉,这就意味着 SDK 不能再继续采集并编码出音视频数据。

a. 注册切入后台通知

//先注册后退消息通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEnterBackground:) 
    name:UIApplicationDidEnterBackgroundNotification object:nil];

b. 切后台处理

//收到通知后,调用beginBackgroundTaskWithExpirationHandler
 - (void)handleEnterBackground:(NSNotification *)notification
{
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    }];
    [_publisher pause];
}

c. 切前台处理

//切前台处理
 - (void)handleEnterForeground:(NSNotification *)notification
{
    [_publisher resume];
}

8.9 停止推流

结束推流很简单,不过要做好清理工作,因为用于推流的 VHLivePublisher是不能多实例并行运转的,所以清理工作不当会导致下次直播遭受不良的影响。

//停止推流
 - (void)stopRtmpPublish {
    [_publisher stopPublish];
    _publisher.delegate = nil;
}

8.10 停止采集

停止音视频采集,并关闭预览画面

[_publisher stopCapture];//停止采集

8.11 销毁publisher

销毁初始化数据,同步销毁,如果感觉销毁太慢,可以开线程去销毁

[_publisher destoryObject];

9 事件处理

  • 推流状态监听

SDK 通过 VHLivePublisherDelegate 代理来监听推流相关的事件

事件ID 数值 含义说明
VHPublishStatusNone 0
VHPublishStatusPushConnectSucceed 1 直播连接成功
VHPublishStatusUploadSpeed 2 直播上传速率
VHPublishStatusUploadNetworkException 3 发起端网络环境差
VHPublishStatusUploadNetworkOK 4 发起端网络环境恢复正常
  • 错误通知
错误类型 数值 含义说明
VHPublishErrorNone 0
VHPublishErrorPusherError 1 推流相关错误@{code:"10001" ,content: "xxxxx"}
VHPublishErrorAuthError 2 验证等相关错误
VHPublishErrorParamError 3 参数相关错误
VHPublishErrorCaptureError 4 采集相关错误