乐视移动直播的集成(一)—— 乐视云直播产品及其SDK

乐视移动直播的集成(一)—— 乐视云直播产品及其SDK

版本记录

版本号

时间

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文档如下所示。

推流端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即可。如下图所示。

iPhone 5s真机测试

下面看一下使用方法。

第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引入)。

- (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播放端以后集成,待续~~~

后续

乐视云直播服务还有很多的没有写,剩下的待更新吧~~~~,晚安,明天周六了,还要加班,哈哈。

山水之美

相关推荐

威少与Jordan续约10年成最赚钱“头牌” 新合同含实战签名战靴
斗鱼是什么?它提供哪些服务?
365跑腿客服电话号码

斗鱼是什么?它提供哪些服务?

📅 07-04 👁️ 9963
三孔指的是什么?著名景点曲阜三孔的由来
365跑腿客服电话号码

三孔指的是什么?著名景点曲阜三孔的由来

📅 06-30 👁️ 8597