樂視移動直播的集成(一)—— 樂視云直播產品及其SDK

版本記錄

版本號 時間
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文檔如下所示。

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

iPhone 5s真機測試

下面看一下使用方法。

第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ù)

樂視云直播服務還有很多的沒有寫,剩下的待更新吧~~~~,晚安,明天周六了,還要加班,哈哈。

山水之美
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容