版本記錄
| 版本號 | 時間 |
|---|---|
| V1.0 | 2017.05.12 |
前言
以前做過移動直播項目,做直播的推流和拉流用的是樂視的移動直播業(yè)務,集成樂視的移動業(yè)務的SDK。
詳情
一、直播服務的基本架構
樂視移動云直播的基本框架如下:

集成過程需要下面四部:

樂視移動云直播的基本特點如下:
- 跨平臺嵌入:支持大眾應用平臺,如Android、iOS,可賦予App、智能移動硬件設備實現全球實時移動直播的能力。
- 實時轉碼:提供實時轉碼處理能力,為不同的播放設備提供
合適的碼率。 - 自動錄制:云端自動錄制,快速生成視頻文件,即時進行二
次視頻分享。 - 直播防盜鏈:支持接入、推流、播放防盜鏈,保護視頻
內容萬無一失。 - 多協議播放:輸出多種播放協議,應對不同平臺不同設備的播放需求。
- 自定義皮膚:隨心打造麥克風、閃光燈,攝像頭轉換、
直播按鈕等桌面圖標,新增變焦、鏡像/非鏡像切換的功能。 - 開放API接口:服務端全套開放的API,滿足客戶業(yè)務的直播服務對接。
二、樂視移動云直播服務
1. 移動推流服務
- 切換前置/后置攝像頭
- 麥克風啟用/禁音
- 直播視頻手動對焦
- 自定義直播碼率
- 自定義視頻分辨率
- 自動網絡重連
- 弱網環(huán)境監(jiān)測提示
- 支持5種主流濾鏡效果
- 鏡像/非鏡像切換
- 變焦功能(鏡頭焦距可以調節(jié)改變)
2. 轉碼服務
實時輸出不同清晰度的碼率;
3. 存儲服務
兩種存儲方式:云點播和云存儲;
4. 直播監(jiān)管服務
實時直播預覽,一鍵直播斷流;
5. 自動錄制
自動完成直播錄制,支持云存儲;
6. 防盜鏈
保護直播應用的隱私安全;
7. 移動播放器
- 自定義播放皮膚
- 核心控制功能:播放/停止,音量大小,全屏/半屏
- 硬件解碼
- 數據統(tǒng)計
- 原畫播放
- 弱網壞境監(jiān)測提示
8. 數據查詢服務
統(tǒng)計應用帶寬峰值,合算應用使用流量;
三、樂視云服務的SDK
先給出樂視云服務SDK的地址
SDK的下載
移動直播所需推流的是下面的這兩個SDK。


下載解壓完畢之后,可見

SDK的概覽
1. SDK推流端
推流端SDK文檔如下所示。

其中CaptureStreamingViewController為有皮膚版推流界面,便于不需要特殊界面的開發(fā)者快速接入和了解我們SDK的常用功能。LCStreamingManager為底層的無皮膚推流工具類,開發(fā)者可以方便地定制自己的推流界面。LCVidiconItem為云直播所需的輔助類。
下面看一下工程配置。
第1步:將壓縮包中的Libs文件夾拖入開發(fā)者自己的工程目錄,確認勾選了“Copy items to destination’s group folder”選項,并選擇您要添加到的Target,然后手動添加添加系統(tǒng)庫。
- CoreMedia.framework
- AudioToolbox.framework
- VideoToolbox.framework
- AVFoundation.framework
- libc++.tbd
- libz.tbd
- libiconv.2.4.0.tbd
如下圖所示。

第2步:關閉BITCODE的開關,由于目前靜態(tài)庫不支持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地址。開發(fā)者可以使用本SDK向任意有效的rtmp地址推流,或根據如下規(guī)則生成樂視云移動直播使用的rtmp地址:
推流url規(guī)則
rtmp://推流域名/live/流名稱?tm=yyyyMMddHHmmss&sign=xxx
播放sign規(guī)則 :
sign參數=MD5(流名稱+ tm參數 + 私鑰)
其中流名稱可以是任意數字、字母的組合
私鑰主要用于推、播防盜鏈中的加密,請在云計算的開發(fā)者賬號后臺查看
示例:rtmp://400438.mpush.live.lecloud.com/live/mytest1?tm=20160406154640&sign=c445f98bed147e4463185efa4a639978
播放url規(guī)則
rtmp://播放域名/live/流名稱?tm=yyyyMMddHHmmss&sign=xxx
播放sign規(guī)則 :
sign參數=MD5(流名稱+ tm參數 + 私鑰 + “l(fā)ecloud”)
其中流名稱可以是任意數字、字母的組合
私鑰主要用于推、播防盜鏈中的加密,請在云計算的開發(fā)者賬號后臺查看
示例:rtmp://400438.mpull.live.lecloud.com/live/mytest1?tm=20160406154640&sign=7922d30aefbe2740c55bc6b032736208
開發(fā)者可以參考或直接使用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:無皮膚版推流的使用說明:
??如果開發(fā)者追求更加靈活的定制化界面,則可以使用本SDK的無皮膚版本:LCStreamingManager。此控制器沒有多余的UI元素,并向開發(fā)者返回預覽界面(UIView),開發(fā)者可以根據自己的需求進行自定義。具體的使用步驟參考下面的代碼示例。
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];
//將推流的預覽視圖添加到開發(fā)者提供的一個view中
[self.videoHolderView addSubview:[manager videoView]];
…… ……
[manager startStreamingWithRtmpAdress:_rtmpUrlString];
其步驟可歸結為:
- 獲取LCStreamingManager。
- 設置委托對象,委托方法- (void) connectionStatusChanged: (LCStreamingSessionState) sessionState; 為必須實現的方法,音視頻采集Session的狀態(tài)發(fā)生變化時會調用此方法。其他非必須實現的方法請參閱頭文件注釋或者下文提供的文檔。
- 設置推流的正方向,默認為UIInterfaceOrientationPortrait豎屏方向。
- 配置音視頻采集Session,視頻尺寸videoSize建議采用標準分辨率,如480p,720p分辨率。
- 設置預覽視圖的frame。
- 設置是否啟用手動對焦等功能,默認未啟用。
- 將推流的預覽視圖添加到開發(fā)者提供的任意可見view中,一般為全屏顯示的UIView。
- 在合適的時機調用startStreamingWithRtmpAdress即可開始推流,其參數rtmpUrlString與有皮膚版的rtmpURL生成規(guī)則一致。
第3:濾鏡的使用
??從推流SDK 2.0開始,我們使用了新的底層框架,同時帶來了新的濾鏡,相較1.2版本的濾鏡性能有大幅提升,并且不需要引入第三方資源,同時也去掉了老版本中的一些不常用濾鏡。使用方法是調用LCStreamingManager 中的- (void)setFilter:(LCVideoFilter)filter方法,詳見枚舉參數LCVideoFilter的定義。
2. SDK播放端
SDK播放端以后集成,待續(xù)~~~
后續(xù)
樂視云直播服務還有很多的沒有寫,剩下的待更新吧~~~~,晚安,明天周六了,還要加班,哈哈。
