版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.05.12 |
前言
以前做过移动直播项目,做直播的推流和拉流用的是乐视的移动直播业务,集成乐视的移动业务的SDK。
详情
一、直播服务的基本架构
乐视移动云直播的基本框架如下:
集成过程需要下面四部:
乐视移动云直播的基本特点如下:
- 跨平台嵌入:支持大众应用平台,如Android、iOS,可赋予App、智能移动硬件设备实现全球实时移动直播的能力。
- 实时转码:提供实时转码处理能力,为不同的播放设备提供
合适的码率。 - 自动录制:云端自动录制,快速生成视频文件,即时进行二
次视频分享。 - 直播防盗链:支持接入、推流、播放防盗链,保护视频
内容万无一失。 - 多协议播放:输出多种播放协议,应对不同平台不同设备的播放需求。
- 自定义皮肤:随心打造麦克风、闪光灯,摄像头转换、
直播按钮等桌面图标,新增变焦、镜像/非镜像切换的功能。 - 开放API接口:服务端全套开放的API,满足客户业务的直播服务对接。
二、乐视移动云直播服务
1. 移动推流服务
- 切换前置/后置摄像头
- 麦克风启用/禁音
- 直播视频手动对焦
- 自定义直播码率
- 自定义视频分辨率
- 自动网络重连
- 弱网环境监测提示
- 支持5种主流滤镜效果
- 镜像/非镜像切换
- 变焦功能(镜头焦距可以调节改变)
2. 转码服务
实时输出不同清晰度的码率;
3. 存储服务
两种存储方式:云点播和云存储;
4. 直播监管服务
实时直播预览,一键直播断流;
5. 自动录制
自动完成直播录制,支持云存储;
6. 防盗链
保护直播应用的隐私安全;
7. 移动播放器
- 自定义播放皮肤
- 核心控制功能:播放/停止,音量大小,全屏/半屏
- 硬件解码
- 数据统计
- 原画播放
- 弱网坏境监测提示
8. 数据查询服务
统计应用带宽峰值,合算应用使用流量;
三、乐视云服务的SDK
先给出乐视云服务SDK的地址
SDK的下载
移动直播所需推流的是下面的这两个SDK。
下载解压完毕之后,可见
SDK的概览
1. SDK推流端
推流端SDK文档如下所示。
其中CaptureStreamingViewController为有皮肤版推流界面,便于不需要特殊界面的开发者快速接入和了解我们SDK的常用功能。LCStreamingManager为底层的无皮肤推流工具类,开发者可以方便地定制自己的推流界面。LCVidiconItem为云直播所需的辅助类。
下面看一下工程配置。
第1步:将压缩包中的Libs文件夹拖入开发者自己的工程目录,确认勾选了“Copy items to destination’s group folder”选项,并选择您要添加到的Target,然后手动添加添加系统库。
- CoreMedia.framework
- AudioToolbox.framework
- VideoToolbox.framework
- AVFoundation.framework
- libc++.tbd
- libz.tbd
- libiconv.2.4.0.tbd
如下图所示。
第2步:关闭BITCODE的开关,由于目前静态库不支持BITCODE,需要在工程设置中关闭BITCODE的开关以通过编译。在TARGETS->Build Settings->Enable Bitcode,将值设置为NO。
第3步:设置Other Linker在TARGETS->Build Settings设置中找到Other Linker Flags,添加 -all_load。
第4步:库冲突问题如果出现第三方库冲突问题(duplicate symbol),比如AFNetworking相关类冲突,只需删除本SDK中提供的单独的库文件(libAFNetworking.a等)即可。
第5步:iPhone 5s真机测试的问题iPhone 5s真机调试推流SDK时,可能会出现异常,请在schemes设置中,找到Options -> GPU Frame Capture选项,并选择Metal即可。如下图所示。
下面看一下使用方法。
第1步:生成推流rtmp地址:推流rtmp地址是用于推送直播视频、音频流的地址;视频播放端同样需要对应的rtmp地址。开发者可以使用本SDK向任意有效的rtmp地址推流,或根据如下规则生成乐视云移动直播使用的rtmp地址:
推流url规则
rtmp://推流域名/live/流名称?tm=yyyyMMddHHmmss&sign=xxx
播放sign规则 :
sign参数=MD5(流名称+ tm参数 + 私钥)
其中流名称可以是任意数字、字母的组合
私钥主要用于推、播防盗链中的加密,请在云计算的开发者账号后台查看
示例:rtmp://400438.mpush.live.lecloud.com/live/mytest1?tm=20160406154640&sign=c445f98bed147e4463185efa4a639978
播放url规则
rtmp://播放域名/live/流名称?tm=yyyyMMddHHmmss&sign=xxx
播放sign规则 :
sign参数=MD5(流名称+ tm参数 + 私钥 + “lecloud”)
其中流名称可以是任意数字、字母的组合
私钥主要用于推、播防盗链中的加密,请在云计算的开发者账号后台查看
示例:rtmp://400438.mpull.live.lecloud.com/live/mytest1?tm=20160406154640&sign=7922d30aefbe2740c55bc6b032736208
开发者可以参考或直接使用Demo中的相关代码(需要#import引入<CommonCrypto/CommonDigest.h>)。
- (NSString *)rtmpAddressWithDomain:(NSString *)domain streamName:(NSString *)stream appKey:(NSString *)appKey
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
NSString *sign = [self md5:[NSString stringWithFormat:@"%@%@%@", stream, currentDateStr, appKey]];
NSString *ret = [NSString stringWithFormat:@"rtmp://%@/live/%@?&tm=%@&sign=%@", domain, stream, currentDateStr, sign];
return ret;
}
- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
初始化CaptureStreamingViewController并显示引入CaptureStreamingViewController.h, 初始化CaptureStreamingViewController并显示该ViewController即可。
#import "CaptureStreamingViewController.h"
CaptureStreamingViewController * viewController = [[CaptureStreamingViewController alloc] initWithRTMPURL:rtmpURL title:@"title" orientation:CaptureStreamingViewControllerOrientationLandscape];
[self presentViewController:viewController animated:YES completion:nil];
CaptureStreamingViewController的初始化函数initWithRTMPURL的形参和含义如下:
形参 | 含义 |
---|---|
1.rtmpURL | 推流rtmp地址 |
2.title | 显示在推流界面顶部的名称,可以传入流名称或其他任意值;如果不需要显示则传入nil |
3.orientation | 类型为CaptureStreamingViewControllerOrientation的枚举值,指定推流界面的方向:竖屏CaptureStreamingViewControllerOrientationPortrait或横屏CaptureStreamingViewControllerOrientationLandscape |
高级用法
第1:有皮肤版推流的定制:
前文介绍的CaptureStreamingViewController就是有皮肤版推流的视图控制器。该控制器提供了一些简单的配置参数,直接设置或读取属性的值即可。具体含义及默认值见注释。
//预设的分辨率,默认值为CaptureStreamingViewControllerPreset640x360
@property (nonatomic, assign) CaptureStreamingViewControllerPreset preset;
//视频流比特率,默认值为800000bps
@property (nonatomic, assign) int bitRate;
//每秒的视频帧数,默认值为24fps
@property (nonatomic, assign) int frameRate;
//当前预览视图的图像(只读)
@property (nonatomic, readonly) UIImage *currentCameraPreviewImage;
第2:无皮肤版推流的使用说明:
如果开发者追求更加灵活的定制化界面,则可以使用本SDK的无皮肤版本:LCStreamingManager。此控制器没有多余的UI元素,并向开发者返回预览界面(UIView),开发者可以根据自己的需求进行自定义。具体的使用步骤参考下面的代码示例。
LCStreamingManager *manager = [[LCStreamingManager alloc] init];
//或manager = [LCStreamingManager sharedManager];
manager.delegate = self;
//配置推流正方
manager.pushOrientation = UIInterfaceOrientationPortrait;
//配置推流参数
[manager configVCSessionWithVideoSize:CGSizeMake(720, 1280)
frameRate:24
bitrate:800000
useInterfaceOrientation:YES];
//配置预览视图的frame
[manager configVideoViewFrame:self.view.bounds];
[manager enableManulFocus:YES];
//将推流的预览视图添加到开发者提供的一个view中
[self.videoHolderView addSubview:[manager videoView]];
…… ……
[manager startStreamingWithRtmpAdress:_rtmpUrlString];
其步骤可归结为:
- 获取LCStreamingManager。
- 设置委托对象,委托方法- (void) connectionStatusChanged: (LCStreamingSessionState) sessionState; 为必须实现的方法,音视频采集Session的状态发生变化时会调用此方法。其他非必须实现的方法请参阅头文件注释或者下文提供的文档。
- 设置推流的正方向,默认为UIInterfaceOrientationPortrait竖屏方向。
- 配置音视频采集Session,视频尺寸videoSize建议采用标准分辨率,如480p,720p分辨率。
- 设置预览视图的frame。
- 设置是否启用手动对焦等功能,默认未启用。
- 将推流的预览视图添加到开发者提供的任意可见view中,一般为全屏显示的UIView。
- 在合适的时机调用startStreamingWithRtmpAdress即可开始推流,其参数rtmpUrlString与有皮肤版的rtmpURL生成规则一致。
第3:滤镜的使用
从推流SDK 2.0开始,我们使用了新的底层框架,同时带来了新的滤镜,相较1.2版本的滤镜性能有大幅提升,并且不需要引入第三方资源,同时也去掉了老版本中的一些不常用滤镜。使用方法是调用LCStreamingManager 中的- (void)setFilter:(LCVideoFilter)filter方法,详见枚举参数LCVideoFilter的定义。
2. SDK播放端
SDK播放端以后集成,待续~~~
后续
乐视云直播服务还有很多的没有写,剩下的待更新吧~~~~,晚安,明天周六了,还要加班,哈哈。