乐视移动直播的集成(一)—— 乐视云直播产品及其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引入<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播放端以后集成,待续~~~

后续

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

山水之美
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容