Page History

Streamer

Last edited by 张旭

北京中投视讯 iOS推流SDK 2.1.4

一.产品概述

CNLiveGPUStreamerKit 2.1.5 iOS SDK 是视讯云推出的 iOS 平台上使用软件开发工具包(SDK),负责视频直播的采集和推流。

二.版本更新说明
  • 2017.7.6(版本号:2.1.5)

    1、修改SDK集成方式;

  • 2017.6.19(版本号:2.1.4)

    1、添加初始化方法;

    2、新增主播状态监听通知;

    3、SDK内部时间戳处理;

  • 2017.6.7(版本号:2.1.3)

    1、添加暂停推流方法;

  • 2017.6.1(版本号:2.1.2)

    1、添加录制视频到本地功能;

    2、添加由后台创建活动,SDK开启推流方法;

  • 2017.5.9(版本号:2.1.1)

    1、添加背景音乐功能;

    2、添加推流过程中异常时自动重连设置;

    3、修改视讯云平台推流初始化方法;

  • 2017.4.27(版本号:2.1.0)

    1、添加纯音频推流;

    2、添加几个音效效果;

    3、新增美颜滤镜;

    4、修改初始化方法;

  • 2017.4.12(版本号:2.0.9)

    1、更新SDK内部探针;

  • 2017.03.22 (版本号:2.0.8)

    1、添加退出推流页时需调用的方法;

  • 2017.03.10 (版本号:2.0.7)

    1、新增美颜滤镜;

    2、新增水印文字和图像;

    3、支持动态切换画面朝向;

    4、支持自动变焦、曝光和缩放;

  • 2016.12.08(版本号:2.0.4)

    1、修复结束状态未传入后台bug;

    2、增加控制台日志输出开关;

  • 2016.11.22(版本号:2.0.2)

    1、添加直播过程中屏幕自动休眠处理;

    2、开始推流方法返回的数据格式改为NSDictionary;

    3、删除结束通知和异常通知;

  • 2016.11.02(版本号:2.0.1)

    1、删除获取推流地址方法,初始化SDK并设置参数后可预览画面,开始推流前传入与活动相关参数;

三.SDK功能特性
  • 视频编码器支持软编,硬编;
  • 多分辨率编码支持;
  • 摄像头控制(前后摄像头,摄像头朝向,闪光灯控制);
  • 支持rtmp协议直播推流;
  • 支持美颜滤镜;
  • 支持耳返;
  • 支持纯音频推流;
  • 支持分别设置采集和推流的分辨率;
  • 支持预览和推流分别镜像设置;
  • 支持自定义水印图片和文字;
  • 推流过程中可动态切换画面朝向;
  • 支持自动变焦与曝光以及缩放操作;
  • 支持背景音乐功能;
  • 支持推流异常时自动重连;
  • 支持录制视频到本地(new);
四.系统要求
  • 最低支持iOS版本:iOS 8.0
  • 支持的CPU架构:armv7,arm64,x86_64

    五.SDK 集成方法
  • 下载直播工具SDK,直播和推流融合版SDK

  • 导入SDK: 由于我们做的是动态库,在使用的时候需要把Framework同时添加’中,另外,将CNLiveMsgTools.framework、GPUImage.framework、libksygpulive.framework一并添加。 导入美颜资源文件KSYGPUResource.bundle

注意: Build Settings -> Other Linker Flags 中添加 –ObjC

  • 引入头文件 #import <CNLivePlayerSDK/CNLiveWebcastManager.h>

注意: 提交APP到App Store 时请用发布版SDK(发布版不支持模拟架构)。

六.系统权限
<key>NSCameraUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSPhotoLibraryUsageDescription</key>
<string></string>
七.SDK使用
  1. 简单推流示例
  • 初始化直播云SDK
/**
 @abstract      初始化直播云SDK(该方法默认正式环境)
 @param         appId              在open.cnlive.com网站申请得到的                                           appId
 @param         appKey             在open.cnlive.com网站申请得到的                                           appKey
 @warning       必传参数
 */
- (void)initWithAppId:(NSString *)appId appKey:(NSString *)appKey;

//代码示例:
_kitCN = [[CNLiveGPUStreamerKit alloc] initCNLiveKitWithDefaultConfigWithPureAudioMode:NO];
        _kitCN.activityId = activityId;
        _kitCN.channelId = @"iOStest";
/**
 @abstract      初始化直播云SDK
 @param         appId              在open.cnlive.com网站申请得到的appId
 @param         appKey             在open.cnlive.com网站申请得到的appKey
 @param         isTestEnvironment  YES:测试环境  NO:正式环境
 @warning       必传参数
 */
- (void)initWithAppId:(NSString *)appId appKey:(NSString *)appKey isTestEnvironment:(BOOL)isTestEnvironment;
  • 使用视讯云平台初始化SDK:
/**
 @abstract      初始化(不会打断其他后台的音乐播放)
 @warning       实例化的对象必须赋值给一个全局变量
 @param         pureAudioMode           YES:纯音频推流
 @warning       必传参数
 */
-(instancetype)initCNLiveKitWithDefaultConfigWithPureAudioMode:(BOOL)mode;

注意: 该初始化方法不会打断其他后台音乐播放。

/*
 @abstract      初始化(会打断其他后台的音乐播放)
 @warning       实例化的对象必须赋值给一个全局变量
 @param         pureAudioMode           YES:纯音频推流
 @warning       必传参数
 */
-(instancetype)initCNLiveKitWithInterruptConfigWithPureAudioMode:(BOOL)mode; 
reAudioMode:NO]

注意: 该初始化方法会打断其他后台音乐播放。

  • 普通推流初始化SDK:
/**
 @abstract      初始化(不会打断其他后台的音乐播放)
 @param         mode           YES:纯音频推流
 @warning       实例化的对象必须赋值给一个全局变量
 */
-(instancetype)initWithDefaultConfigWithPureAudioMode:(BOOL)mode;

注意: 该初始化方法不会打断其他后台音乐播放。

/**
 @abstract      初始化(会打断其他后台的音乐播放)
 @param         mode           YES:纯音频推流
 @warning       实例化的对象必须赋值给一个全局变量
 */
-(instancetype)initWithInterruptConfigWithPureAudioMode:(BOOL)mode;

注意: 该初始化方法会打断其他后台音乐播放。

  • 是否开启控制台输出日志(默认开启) @property (nonatomic, assign) BOOL logPrintEnable;

  • 配置推流相关参数

注意: activityId和channelId 为必传参数!!!

/**
 @abstract      活动ID,确保SP下的唯一性
 @discussion    必传参数
 */
@property (nonatomic, strong) NSString *activityId;
/**
 @abstract      主播ID
 @discussion    必传参数
 */
@property (nonatomic, strong) NSString *channelId;
/**
 @abstract      屏幕方向,0:垂直即竖屏 /1:水平即横屏 ,默认为0
 */
@property (nonatomic, assign) BOOL isHorizontalScreen;
/**
 @abstract      活动名称(非必传)
 */
@property (nonatomic, strong) NSString *activityName;
/**
 @abstract      活动状态,0:未开始 /1:已开始 /3:已结束 /4 已下线,默认为0(非必传)
 */
@property (nonatomic, strong) NSString *activityStatus;
/**
 @abstract      开始时间,格式yyyyMMddHHmmss(非必传)
 */
@property (nonatomic, strong) NSString *startTime;
/**
 @abstract      结束时间,格式yyyyMMddHHmmss(非必传)
 */
@property (nonatomic, strong) NSString *endTime;
/**
 @abstract      活动封面(非必传)
 */
@property (nonatomic, strong) NSString *coverImgUrl;
/**
 @abstract      活动分类ID(非必传)
 */
@property (nonatomic, strong) NSString *activityCategory;
/**
 @abstract      扩展字段,参数格式为Map对象的Json字符串(主播昵称、头像、)(非必传)
 */
@property (nonatomic, strong) NSString *extensions;
/**
 @abstract      回调通知活动状态(错误,结束、心跳异常等状态),post 参数activityid、activitystatus值...(非必传)
 */
@property (nonatomic, strong) NSString *callbackAcitvityStatushttpPostUrl;

注意: 开始直播前请确保已传入活动相关参数,开始直播后传入无效!!

配置采集相关参数
  • 采集分辨率

采集分辨率仅在开始采集前设置有效,可参见AVCaptureSessionPresetXXX的定义,默认值为AVCaptureSessionPreset640x480,不同设备支持的预设分辨率可能不同, 请尽量与预览分辨率一致。 _kitCN.capPreset = AVCaptureSessionPreset1280x720;

  • 预览分辨率(仅在开始采集前设置有效,默认值为(640, 360)) _kitCN.previewDimension = CGSizeMake(1280, 720);

  • 视频帧率(有效范围[15~30]) _kitCN.videoFPS = 15;

  • 摄像头位置(前后摄像头 默认为前摄像头) _kitCN.cameraPosition = AVCaptureDevicePositionFront;

  • 推流分辨率(默认值为(640, 360)) _kitCN.streamDimension = CGSizeMake(1280, 720);

配置推流相关参数
  • 获取推流底层推流工具

    @property (nonatomic, readonly) CNLiveStreamerBase *streamerBase;

  • 视频编码器

    视频编码器是用于选择实际编码的方案,目前提供了两种编码器和三种配置方法 kitCN.streamerBase.videoCodec = CNLiveVideoCodecAUTO; CNLiveVideoCodec类型说明:

名称 含义
CNLiveVideoCodec_X264 视频编码器 - h264 软件编码器
CNLiveVideoCodec_QY265 视频编码器 - 仟壹265 软件编码器
CNLiveVideoCodec_VT264 视频编码器 - iOS VT264硬件编码器 (iOS 8.0以上支持)
CNLiveVideoCodec_AUTO 视频编码器 - 由SDK自动选择( VT264 > X264)
  • 视频编码起始码率 开始推流时的视频码率,开始推流后,根据网络情况在 [Min, Max]范围内调节,视频码率上调则画面更清晰,下调则画面更模糊。 _kitCN.streamerBase.videoInitBitrate = 900;

  • 视频编码最高码率 视频编码自适应调整的上限,目标码率。 _kitCN.streamerBase.videoMaxBitrate = 900;

  • 视频编码最低码率

    视频码率自适应调整的下限。 _kitCN.streamerBase.videoMinBitrate = 300;

  • 最大关键帧间隔

    即GOP长度,画面静止时,隔n秒插入一个关键帧。 _kitCN.streamerBase.maxKeyInterval = 2;

  • 音频编码码率

    _kitCN.streamerBase.audiokBPS = 48;

  • 当前是否处于推流状态

    - (BOOL) isStreaming;

采集开启/停止及消息通知
  • 启动预览

    预览画面作为subview,插入到view的最底层,设置完成采集参数之后,按照设置值启动预览,启动后对采集参数修改不会生效,需要访问摄像头和麦克风的权限,若授权失败,其他API都会拒绝服务。注*开始推流前必须先启动预览。 [_kitCN startPreview:self.captureView];

  • 停止预览

    停止预览,停止采集设备,并清理会话。若推流未结束,请先停止推流。 [_kitCN stopPreview];

  • 获取采集状态消息通知

    注册通知:

    [[NSNotificationCenter defaultCenter]   addObserver:self selector:@selector(captureStateChange) name:CNLiveCaptureStateDidChangeNotification object:nil];

    当收到采集状态变化的通知时,通过_kitCN.captureState属性查询新的状态。

采集状态说明:

状态名称 状态说明
CNLiveCaptureStateIdle 设备空闲中
CNLiveCaptureStateCapturing 设备工作中
CNLiveCaptureStateDevAuthDenied 设备授权被拒绝
CNLiveCaptureStateClosingCapture 关闭采集设备中
CNLiveCaptureStateParameterError 参数错误,无法打开(比如设置的分辨率,码率当前设备不支持)
CNLiveCaptureStateDevBusy 设备正忙,请稍后尝试

移除通知:

[[NSNotificationCenter defaultCenter] removeObserver:self name:CNLiveCaptureStateDidChangeNotification object:nil];
推流开启/暂停/停止及消息通知
  • 启动推流

    普通推流: - (void) startStream:(NSURL *)hostURL;
    使用视讯云平台推流(SDK创建活动并开启推流):

    [_kitCN startStream:^{
            NSLog(@"开启推流成功");
       } failure:^(NSDictionary *errorDic) {
            [self toast:errorDic[@"errorMessage"]];
            _startLiveBtn.selected = NO;
       }];

    后台创建活动,SDK负责开启推流:

/**
 @abstract      启动推流
 @param         url           推流地址
 @param         activityId    活动ID
 @warning       后台创建活动完成,开启推流(仅视讯云平台有效)
 */
- (void)startStreamWithUrl:(NSString *)url activityId:(NSString *)activityId success:(void (^)(void))successBlock  failure:(void (^)(NSDictionary *errorDic))failureBlock;
  • 暂停推流
/**
 @abstract      暂停推流(仅视讯云平台有效)
 @warning       恢复推流时根据情况调用 startStream: 或 startStreamWithUrl:方法
 */
- (void)pauseStreaming;
  • 停止推流 [_kitCN stopStream];

  • 获取推流状态消息通知 注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self                                                                  selector:@selector(captureStateChange)                                  name: CNLiveStreamStateDidChangeNotification
                                        object:nil];
当收到采集状态变化的通知时,通过_kitCN.streamState属性查询新的状态。
状态名称 状态说明
CNLiveStreamStateIdle 初始化时状态为空闲
CNLiveStreamStateConnecting 连接中
CNLiveStreamStateConnected 已连接
CNLiveStreamStateDisconnecting 断开连接中
CNLiveStreamStateError 推流出错
CNLiveStopStreamSuccess 结束推流成功
CNLiveStopStreamFailure 结束推流失败
移除通知:
[[NSNotificationCenter defaultCenter] removeObserver:self                                                   name: CNLiveStreamStateDidChangeNotification
                                object:nil];
重连

推流错误码,用于指示推流失败的原因,通过_kitCN.streamErrorCode属性查询状态,可根据错误码选择是否重新连接。

状态名称 状态说明
CNLiveStreamErrorCode_NONE 正常无错误
CNLiveStreamErrorCode_CNLiveAUTHFAILED SDK 鉴权失败
CNLiveStreamErrorCode_ENCODE_FRAMES_FAILED 当前帧编码失败
CNLiveStreamErrorCode_CODEC_OPEN_FAILED 无法打开配置指示的CODEC
CNLiveStreamErrorCode_CONNECT_FAILED 连接出错,检查地址
CNLiveStreamErrorCode_CONNECT_BREAK 网络连接中断
CNLiveStreamErrorCode_RTMP_NonExistDomain rtmp 推流域名不存在
CNLiveStreamErrorCode_RTMP_NonExistApplication rtmp 应用名不存在
CNLiveStreamErrorCode_RTMP_AlreadyExistStreamName rtmp 流名已存在
CNLiveStreamErrorCode_RTMP_ForbiddenByBlacklist rtmp 被黑名单拒绝
CNLiveStreamErrorCode_RTMP_InternalError rtmp 内部错误
CNLiveStreamErrorCode_RTMP_URLExpired rtmp URL 地址已过期
CNLiveStreamErrorCode_RTMP_SignatureDoesNotMatch rtmp URL 地址签名错误
CNLiveStreamErrorCode_RTMP_InvalidAccessKeyId rtmp URL 中AccessKeyId非法
CNLiveStreamErrorCode_RTMP_BadParams rtmp URL 中参数错误
CNLiveStreamErrorCode_RTMP_ForbiddenByRegion rtmp URL 中的推流不在发布点内
CNLiveStreamErrorCode_FRAMES_THRESHOLD SDK 因为鉴权失败停止推流
CNLiveStreamErrorCode_NO_INPUT_SAMPLE 没有输入的数据,无法开始推流
CNLiveStreamErrorCode_DNS_Parse_failed 对于URL中的域名解析失败
CNLiveStreamErrorCode_Connect_Server_failed 对于URL对应的服务器连接失败(无法建立TCP连接)
CNLiveStreamErrorCode_RTMP_Publish_failed 跟RTMP服务器完成握手后,向{appname}/{streamname} 推流失败
CNLiveStreamErrorCode_AV_SYNC_ERROR 音视频同步失败 (输入的音频和视频的时间戳的差值超过5s)
CNLiveStreamErrorCode_INVALID_ADDRESS 非法地址(地址为空或url中的协议或本地文件的后缀SDK不支持, 请检查)
CNLiveStreamErrorCode_ABNORMAL 异常

注意: 当推流错误码CNLiveStreamErrorCode状态为CNLiveStreamErrorCode_CONNECT_BREAK,CNLiveStreamErrorCode_CODEC_OPEN_FAILED,CNLiveStreamErrorCode_AV_SYNC_ERROR, CNLiveStreamErrorCode_ABNORMAL时为可重连状态。

代码示例:

- (void) tryReconnect
{
    dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
    dispatch_after(delay, dispatch_get_main_queue(), ^{

        NSLog(@"try again");

        [_kitCN stopStream];

        if (_isAuthLive) {

            [_kitCN startStream:^{
                NSLog(@"开启推流成功 ------- success");
                _startLiveBtn.selected = YES;

            } failure:^(NSDictionary *errorDic) {
                [self toast:errorDic[@"errorMessage"]];
                _startLiveBtn.selected = NO;
            }];

        } else {
            [_kitCN startStream:_hostURL];
        }
    });
}
  • 退出推流
/**
 @abstract   退出推流页面时调用
 */
- (void)quitStreaming;
特色功能说明
摄像头相关操作
  • 切换摄像头

    [_kitCN switchCamera];

  • 摄像头朝向

/**
 @abstract   摄像头朝向
 @discussion 参见UIInterfaceOrientation
 @discussion 竖屏时: width < height
 @discussion 横屏时: width > height
 @discussion 需要与UI方向一致
 */
- (void) setVideoOrientationBy:(UIInterfaceOrientation)uiOrien;
  • 开关闪光灯
/**
 @abstract      开关闪光灯
 @discussion    切换闪光灯的开关状态 开 <--> 关
 @warning      对后摄像头设置有效
 */
- (void) toggleTorch;
- (void) setTorchMode:(AVCaptureTorchMode)mode;
  • 美颜 获取美颜工具
/**
 @abstract   获取美颜工具
 */
@property (nonatomic, readonly) CNLiveBeautifyFaceFilter *beautifyFaceFilter;

注意: 默认旧美颜,磨皮参数为0.5

  • 美颜类型

    目前提供了四种美颜类型 | 美颜类型 | 说明 | | --- | --- | | CNLiveBeautyTypeNone | 无 | | CNLiveBeautyTypeOld | 旧美颜 | | CNLiveBeautyTypeRuddy | 红润美颜 | | CNLiveBeautyTypeSpecial | 美颜特效 |

/**
 @abstract          美颜类型
 @param beautyType  类型
 @warn  旧美颜仅grindRatio参数可调节,另两个参数设置无效
 */
- (void)setBeautyType:(CNLiveBeautyType)beautyType;
  • 美颜特效类型
/**
 @abstract   CNLiveBeautyTypeSpecial 美颜特效类型,需先设置CNLiveBeautyType为CNLiveBeautyTypeSpecial
 */
- (void)setCurEffectIdx:(CNLiveSpecialEffects)curEffectIdx;   //美颜特效类型
  • 自定义美颜参数调节
/**
 @abstract          美颜参数调节
 @param grindRatio  磨皮
 @param whitenRatio 美白
 @param intensity   特效
 */
- (void)filterAdjustingParameterWithGrindRatio:(CGFloat)grindRatio
                                   whitenRatio:(CGFloat)whitenRatio
                                     intensity:(CGFloat)intensity;  
- (void)filterAdjustingParameterWithGrindRatio:(CGFloat)grindRatio                                              whitenRatio:(CGFloat)whitenRatio                                               intensity:(CGFloat)intensity                                                   effectsIdx:(SpecialEffects)idx;
代码示例:
__weak StreamerDetailViewController *weakself = self;

        _filterView.filterViewBlock = ^(float grindRatio , float whitenRatio, float intensity){

            [weakself.kitCN.beautifyFaceFilter filterAdjustingParameterWithGrindRatio:grindRatio
                                                                          whitenRatio:whitenRatio
                                                                            intensity:intensity];
        };

        _filterView.currentTypeBlock = ^(NSInteger currentType){
            [weakself.kitCN.beautifyFaceFilter  setBeautyType:currentType];
        };

        _filterView.currentIdxBlock = ^(NSInteger currentIdx){
            weakself.kitCN.beautifyFaceFilter.curEffectIdx = currentIdx;
        };
音频采集相关配置
  • 首先获取音频采集工具类
/**
 @abstract   获取音频采集工具
 */
@property (nonatomic, readonly) CNLiveAudioCapture *audioCapture;
  • 是否有耳机麦克风可用

    return 是/否有耳机麦克风可用。

    + (BOOL)isHeadsetPluggedIn;

  • 开启/关闭耳返

    如果在没有插入耳机的情况下启动,容易出现刺耳的声音。

代码示例: //耳返

  if ([CNLiveAudioCapture isHeadsetPluggedIn]) {
        [_kitCN.audioCapture setBPlayCapturedAudio:YES];
    }
  • 设置mic采集的声音的音量
/**
 @abstract  设置mic采集的声音音量
 @discussion 调整范围 0.0~1.0
 */
@property(nonatomic, assign) float micVolume;
  • 设置耳返音量
/**
 @abstract  设置耳返音量
 @discussion 调整范围 0.0~1.0
 */
@property(nonatomic, assign) Float32 bPlayVolume;
  • 混响类型 目前提供了4种类型的混响场景, type和场景的对应关系如下:

    • 0 关闭
    • 1 录音棚
    • 2 KTV
    • 3 小舞台
    • 4 演唱会 @property(nonatomic, assign) int reverbType;
  • 音效类型

/**
 @abstract 音效类型
 @discussion 目前提供了4种音效类型, type和音效的对应关系如下
 - 0 关闭
 - 1 大叔
 - 2 萝莉
 - 3 庄严
 - 4 机器人
 */
@property (nonatomic, assign) int audioEffectType;
  • 镜像
  • 预览设置为镜像模式(默认为 NO) @property (nonatomic, assign) BOOL previewMirrored;

  • 推流设置为镜像模式(默认为NO) @property (nonatomic, assign) BOOL streamerMirrored;

  • 动态横竖屏切换 即在推流过程中可根据UI的朝向转换预览与推流画面。

/**
 @abstract   根据UI的朝向旋转预览视图, 保证预览视图全屏铺满窗口
 @param      orie 旋转到目标朝向, 需要从demo中获取UI的朝向传入
 @discussion 采集到的图像的朝向还是和启动时的朝向一致
 */
- (void) rotatePreviewTo: (UIInterfaceOrientation) orie;
/**
 @abstract 根据UI的朝向旋转推流画面
 @param    orie 旋转到目标朝向, 需要从demo中获取UI的朝向传入
 */
- (void) rotateStreamTo: (UIInterfaceOrientation) orie;

代码示例:

UIInterfaceOrientation orie = [[UIApplication sharedApplication] statusBarOrientation];
    [_kitCN rotatePreviewTo:orie];

    if (_kitCN.isStreaming) {       //是否处于推流状态
        [_kitCN rotateStreamTo:orie];
}
水印
  • 水印logo的图片

    可设置本地图片或网络图片,设置为nil为清除水印图片。 @property (nonatomic, readwrite) UIImage *logoPic; //本地图片 @property (nonatomic, readwrite) NSURL *logoURL; //网络图片

  • 水印logo图片的位置和大小

    位置和大小的单位为预览视图的百分比, 左上角为(0,0), 右下角为(1.0, 1.0)。 @property (nonatomic, readwrite) CGRect logoRect;

  • 水印图片透明度

/**
 @abstract          水印logo的图片的透明度
 @discussion alpha为透明度(0-1),0完全透明,1完全不透明
 */
@property (nonatomic, readwrite) CGFloat              logoAlpha;
  • 水印文字的label
/**
 @abstract       水印文字的label
 @discussion    借用UILabel来指定文字的颜色,字体, 透明度, 对齐方式等属性
 @discussion    请注意保证背景图片的尺寸, 太大的图片会导致内存占用过高
 @warning    如果使用非等宽字体, 可能导致闪烁(默认为Courier)
 @warning    picMixer和UILabel都有alpha属性, 建议只选用其中一个, 固定               另一个为1.0,
                为了减少接口, 建议直接使用UILabel的属性,
                如果两者同时使用, 最终图层的alpha为两者乘积
 */
@property (nonatomic, readwrite) UILabel             *textLabel;
  • 水印文字的位置和大小
/**
 @abstract   水印文字的位置和大小
 @discussion 位置和大小的单位为预览视图的百分比, 左上角为(0,0), 右下角为             (1.0, 1.0)
 @discussion 如果宽为0, 则根据文字图像的宽高比, 和设置的高度比例, 计算           得到宽度的比例
 @discussion 如果高为0, 方法同上
 */
@property (nonatomic, readwrite) CGRect               textRect;
  • 刷新水印文字的内容
/**
 @abstract   刷新水印文字的内容
 @discussion 先修改文字的内容或格式,调用该方法后生效
 */
- (void) updateTextLabel;

代码示例:

//水印图片
    _kitCN.watermark.logoPic = [UIImage imageNamed:@"互动电视180x180"];
    _kitCN.watermark.logoRect = CGRectMake(0.8, 0.8, 50, 50);
    _kitCN.watermark.logoAlpha = 0.6;

    //水印文字
    _kitCN.watermark.textLabel = [[UILabel alloc] init];
    _kitCN.watermark.textLabel.text = [NSString stringWithFormat:@"cnlive"];
    _kitCN.watermark.textLabel.font = [UIFont systemFontOfSize:8];
    _kitCN.watermark.textRect = CGRectMake(0.78, 0.88, 0.2, 0.04);
    [_kitCN.watermark updateTextLabel];
变焦与曝光
  • 变焦
/**
 @abstract   当前采集设备是否支持自动变焦
 @param      point相机对焦的位置
 */
- (void)focusAtPoint:(CGPoint )point;
  • 曝光
/**
 @abstract   当前采集设备是否支持自动曝光
 @param      point相机曝光的位置
 */
- (void)exposureAtPoint:(CGPoint )point;
  • 触摸缩放因子
/**
 @abstract 触摸缩放因子
 */
@property (nonatomic, assign)   CGFloat pinchZoomFactor;

代码示例:

//对焦与曝光
- (void)onTap:(UIGestureRecognizer *)sender
{
    CGPoint current = [sender locationInView:self.view];
    CGPoint point = [self convertToPointOfInterestFromViewCoordinates:current];
    [_kitCN exposureAtPoint:point];
    [_kitCN focusAtPoint:point];
}

//缩放
- (void)pinchDetected:(UIPinchGestureRecognizer *)recognizer{
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        _currentPinchZoomFactor = _kitCN.pinchZoomFactor;
    }
    CGFloat zoomFactor = _currentPinchZoomFactor * recognizer.scale;//当前触摸缩放因子*坐标比例
    [_kitCN setPinchZoomFactor:zoomFactor];
}
前后台切换
/**
 @abstract   进入后台: 暂停图像采集
 @discussion 暂停图像采集和预览
 */
- (void) appEnterBackground;
/**
 @abstract   回到前台: 恢复采集
 @discussion 恢复图像采集和预览
 */
- (void) appBecomeActive;
自动重连
  • 自动重连次数
/**
 @abstract 自动重连次数 关闭(0), 开启(>0), 默认为0
 @discussion 当内部发现推流错误后, 会在一段时间后尝试重连
 自动重连不会重新获取推流地址, 仍然使用上次推流的地址
 @warning  如果在推流地址有过期时间, 请勿开启
 */
@property (nonatomic, assign) int          maxAutoRetry;
  • 自动重连延时
/**
 @abstract 自动重连延时, 发现连接错误后, 重试的延时
 @discussion 单位为秒, 默认为2s, 最小值为0.1s
 */
@property (nonatomic, assign) double          autoRetryDelay;
  • 自动重连通知
/**
 @abstract 自动重连失败通知(注*仅视讯云平台有效,普通方法推流自动重连失败收不到该通知)
 @discussion 仅推流错误码为 CNLiveStreamErrorCode_CONNECT_BREAK、
                        CNLiveStreamErrorCode_AV_SYNC_ERROR、
                        CNLiveStreamErrorCode_Connect_Server_failed、
                        CNLiveStreamErrorCode_DNS_Parse_failed、
                        CNLiveStreamErrorCode_CODEC_OPEN_FAILED、
                        CNLiveStreamErrorCode_ABNORMAL 时为可重连状          态;
 */
FOUNDATION_EXPORT NSString *const CNLiveStreamRetryConnectFailedNotification NS_AVAILABLE_IOS(7_0);
背景音乐
  • 开始播放背景音乐
/**
 @abstract   开始播放背景音乐
 @param      path 本地音乐的路径
 @param      loop 是否循环播放此音乐
 @return     是否能够开始播放
 */
- (BOOL) startPlayBgm:(NSString*) path
isLoop:(BOOL) loop;
  • 停止播放背景音乐
/**
 @abstract   停止播放背景音乐
 */
- (void) stopPlayBgm;
  • 暂停和恢复
/**
 @abstract   暂停播放背景音乐
 */
- (void) pauseBgm;
/**
 @abstract   恢复播放背景音乐
 */
- (void) resumeBgm;
  • 调整播放进度
/**
 @abstract  seek到指定时间 (拖动进度条)
 @param     time 时间, 请参考 bgmDuration (单位,秒)
 @return    是否seek 成功
 */
- (BOOL) seekToTime:(float)time;
/**
 @abstract  seek到指定进度 (拖动进度条)
 @param     prog 进度, 请参考 bgmProgress
 @return    是否seek 成功
 */
- (BOOL) seekToProgress:(float)prog;
  • 音量与音调
/**
 @abstract   背景音乐的音量
 @discussion 调整范围 0.0~1.0
 @discussion 仅仅调整播放的音量, 不影响回调的音频数据
 */
@property (nonatomic, assign) double bgmVolume;
/**
 @abstract   播放声音的音调
 @discussion 调整范围 [-24.0 ~ 24.0], 默认为0.01, 单位为半音
 @discussion 0.01 为1度, 1.0为一个半音, 12个半音为1个八度
 */
@property (nonatomic, assign) double bgmPitch;
  • 静音
/**
 @abstract   背景音乐播放静音
 @discussion 仅仅静音播放, 不影响回调的音频数据
 */
@property (nonatomic, assign) BOOL bMutBgmPlay;
  • 状态获取
/**
 @abstract    背景音的duration信息(总时长, 单位:秒)
 */
@property (nonatomic, readonly) float bgmDuration;
/**
 @abstract    背景音的已经播放长度 (单位:秒)
 @discussion  从0开始,最大为bgmDuration长度
 */
@property (nonatomic, readonly) float bgmPlayTime;

/**
 @abstract    音频的播放进度
 @discussion  取值从0.0~1.0,大小为bgmPlayTime/bgmDuration;
 */
@property (nonatomic, readonly) float bgmProcess;

/**
 @abstract    音频播放是否运行
 @discussion  音频是否输出到speaker播放
 */
@property (nonatomic, readonly) BOOL isRunning;

/**
 @abstract    播放错误码
 @discussion  播放错误码具体内容可以参考AudioQueue的Apple文档。
 */
@property (nonatomic, readonly) OSStatus audioErrorCode;

/**
 @abstract    播放状态
 */
@property (nonatomic, readonly) CNLiveBgmPlayerState bgmPlayerState;
  • 单曲循环
/**
 @abstract    单曲循环
 */
@property (nonatomic, assign) BOOL bLoop;
  • 播放状态通知
FOUNDATION_EXPORT NSString *const CNLiveBgmAudioStateDidChangeNotification NS_AVAILABLE_IOS(7_0);
录制视频
  • 开始录制
/**
 @abstract      开始录制本地视频(不支持边推边录)
 @param         path        本地存储路径
 */
- (void)startRecordWithFilePath:(NSString *)path;
  • 停止录制本地视频
/**
 @abstract      停止录制本地视频
 @discussion    与 - (void)startRecordWithFilePath: 搭配使用
 */
- (void)stopRecord;
纯音频推流示例
纯音频推流只需设置音频编码码率即可;
(1) 初始化
`_kitCN = [[CNLiveGPUStreamerKit alloc] initWithInterruptConfigWithActivityId:activityId pureAudioMode:YES];`
(2) 配置音频编码码率
`_kitCN.streamerBase.audiokBPS = 48;`
(3) 注册监听
`[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(streamStateChange)name:CNLiveStreamStateDidChangeNotification object:nil];`
(4) 开始推流
 [_kitCN startStream:^{
                NSLog(@"开启推流成功 ------- success");
            } failure:^(NSDictionary *errorDic) {
                [self toast:errorDic[@"errorMessage"]];
                _startLiveBtn.selected = NO;
            }];
(5) 停止推流
    `[_kitCN stopStream];`
(6) 移除通知
`[[NSNotificationCenter defaultCenter] removeObserver:self];`
/**
 *  主播端未停止推流,但是服务端认为该视频不合法,断开推流,接收到该通知主播端应结束推流(视讯云平台有效)
 */
FOUNDATION_EXPORT NSString *const CNLiveServiceConnectBreakNotification NS_AVAILABLE_IOS(7_0);
八.常见问题及解决办法
常见失败信息
errorCode = "sys_1015";
    errorMessage = "app \U5f02\U5e38”;   appid和bundleID不一致

    errorCode = "sys_1002";
    errorMessage = "sign error”;     appkey和appid不一致
运行问题
  • 程序崩溃

    (a) 若程序启动时崩溃,crash 信息为:

    请注意标记位置信息,检查对应SDK是否嵌入到工程中:

    (b) 点击美颜,程序崩溃,crash 信息为:

    请检查资源文件是否导入到工程中:

打包问题
  • 在打包过程中报错:ITMS-90087

请检查此时项目中是否使用的是发布版SDK文件夹下的SDK: