北京中投视讯 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使用
- 简单推流示例
- 初始化直播云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:
