1. 程式人生 > >Android-live如何利用第三方SDK做一款直播軟體

Android-live如何利用第三方SDK做一款直播軟體

SDK服務選擇

目前有很多做直播雲的服務

  • 樂視雲
  • 網易雲信
  • 保利威視
  • 阿里雲
  • 百度雲

可以根據自己的需要做選擇。

直播基本原理

Push推流
也就是直播端,用於採集視訊資訊上傳,處理等。

Pull拉流
使用者實時播放直播的視訊源

服務端
提供視訊的儲存,碼流的處理,壓縮等。一般使用用第三方的服務。

下面將以樂視云為例

賬號建立

樂視雲地址
註冊後會自動生成使用者id金鑰其中的引數是後面直播推流要用到的引數。

想建立活動還需要進行一個身份認證,提交完認證資料後可以聯絡客服快速稽核。

然後就是建立直播活動了。

樂視雲直播服務分為兩種,一種是移動直播,另一種是標準直播。
問了客服,說兩者的區別是標準直播有管理後臺。可以看到直播的狀態

後臺

兩者在推流的時候呼叫的引數也不同。

在控制檯建立活動後會自動生成播放地址,把該地址拷貝到瀏覽器開啟,當處於推流狀態的時候可以看到直播。當然也可以通過App建立活動,後面會提到。

但是會有數秒的延遲。

整合

上面直播使用樂視提供的UI直播元件,包含了麥克風的開關,焦距大小調整,美顏程度和風格,攝像頭切換等。

想要在專案中直接使用需要整合SDK
可以根據需要去選擇相應的SDK。

以安卓為例下載完成後解壓縮開啟檔案找到LeRecorderSkin,將該檔案,以model的形式匯入到專案中,並新增依賴。

使用

LeRecorderSkin中提供了兩種控制元件.
不同的控制元件,初始化直播的方式也不同

1、標準直播:

<?xml version="1.0" encoding="utf-8"?>
<com.le.skin.LePublisherSkinView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lpsv_stream_recorder"
>
</com.le.skin.LePublisherSkinView>

初始化方法

skinView.initPublish(userid, key, activityId);

2、移動直播:

  • 直接拼接欄位就能實現推流功能。
    推流規則:rtmp://{推流域名}/釋出點/{直播流名稱}。
    播放規則:RTMP協議 - rtmp://{播放域名}/釋出點/{直播流名稱}
    HLS協議 - http(s)://{播放域名}/釋出點/{直播流名稱}/desc.m3u8
    HDL協議 - http(s)://{播放域名}/釋出點/{直播流名稱}.flv
<?xml version="1.0" encoding="utf-8"?>
<com.le.skin.PublisherSkinView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lpsv_stream_recorder">

</com.le.skin.PublisherSkinView>

初始化方法

skinView.initPublish(url);

到這裡就可以完成基礎的直播功能。
但是如果想通過App拓展更多的功能,比如修改直播資訊,獲取推流地址等。就需要進行http請求。

由於控制元件是存在引入的model中,所以可以在原來的基礎上增加或者減少功能。

比如在直播的時候,title預設顯示是活動ID,如果我們想修改成活動名稱,首先需要通過網路訪問去解析介面,拿到相應的資料,然後再找到佈局裡的title控制元件。

修改初始化引數,傳入需要修改的資料就行了。

public void initPublish(String userId, String secretKey, String activityId,String name) {
        Log.d(TAG,"initPublish,初始化");
        this.userId = userId;
        this.secretKey = secretKey;
        this.activityId = activityId;
        if(TextUtils.isEmpty(skinParams.getTitle())){
            nameView.setText(name);
        }
        LetvPublisher.init(activityId,userId,secretKey);
        publisher = LetvPublisher.getInstance();
        super.initPublish();
    }

手動請求活動

標準直播文件
手動請求需要用到網路訪問框架,這裡使用的是Retrofit2.0
在請求任何一個介面前都需要提交5個固定引數

容易出現問題的引數是timestamp時間戳、和sign驗證碼。
ver版本大多數是4.0,有少部分介面是4.1具體可以在檢視介面方法的時候獲取。
時間戳的獲取方法是long timestamp = System.currentTimeMillis();
sign,是拼接過後,並且使用md5加密後的引數。

簡單封裝的網路請求:

  /*
    *獲取直播推流地址
    * ver=4.0
    */
    public static void getPushUrl(String activityId,long timestamp,Callback<ResponseBody> callback){
        String signSting = "activityId" + activityId +
                "method" + MyMethod.NAME_PushUrl +
                "timestamp" + timestamp +
                "userid" + MyMethod.userId +
                "ver" + MyMethod.VER4_0 + MyMethod.KEY;
        Log.e("onsingString====", signSting);
        String sign = MD5Utls.stringToMD5(signSting);
        Retrofit retrofit = new Retrofit.Builder()//建立Rectfit物件
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(Url.LIVE_URL_ROOT)//傳入地址
                .build();
        Api aPi = retrofit.create(Api.class);//例項化介面物件
        Call<ResponseBody> call = aPi.getPushUrl2(MyMethod.NAME_PushUrl, MyMethod.VER4_0, MyMethod.userId, timestamp, activityId, sign);
        call.enqueue(callback);
    }

呼叫方法解析資料:
時間戳的獲取方法,定義在了BaseActivity,當前Activity繼承BaseActivity。這樣能在一定程度上防止時間戳過期。

         NetWorkManager.getPushUrl(activityId, getTimestamp(), new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                Log.e("onResponsePushUrl", "" + response);
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable throwable) {
                Log.e("onFailurePushUrl", "" + throwable);

            }
        });

END

專案已上傳至GitHub,提供有測試賬號,請求直播資訊使用Retrofit訪問。
Live-Push-Android

相關推薦

Android-live如何利用第三方SDK直播軟體

SDK服務選擇 目前有很多做直播雲的服務 樂視雲 網易雲信 保利威視 阿里雲 百度雲 可以根據自己的需要做選擇。 直播基本原理 Push推流 也就是直播端,用於採集視訊資訊上傳,處理等。 Pull拉流 使用者實時播放直播的視訊源 服務端

Android自定義EditText:手把手教你鍵刪除&自定義樣式的SuperEditText

前言 Android開發中,EditText的使用 非常常見 本文將手把手教你做一款 附帶一鍵刪除功能 & 自定義樣式豐富的 SuperEditText控制元件,希望你們會喜歡。 目錄 1. 簡介 一款 附帶一鍵刪除功

Android 實踐:可用的天氣 APP

可能很多人會問:之前已經寫過一篇博文來介紹怎麼做一款簡單的新聞APP(http://blog.csdn.net/yiwei12/article/details/71249628),為什麼還要專門一篇來介紹怎麼做一款天氣 APP,畢竟網路請求和資料處理都是大同小異

Android 實踐:新聞 APP

跟程式碼相關的工作,大多唯手熟爾,所以這裡花了點時間做了款簡易版的新聞 APP,雖然都是些基礎的內容,不過還是可以加深自己對部分程式碼的理解。至少,可以加深自己的記憶 步驟 依賴庫 網路請求 網路解析 介面佈局 最後 執行介面 執行GIF 完整程式

[轉]個人開發者Android App需要知道的事情

原文連結:https://www.cnblogs.com/hubcarl/p/4030884.html目前,應用資訊型別App功能核心都包括內容列表展示、內容詳情展示、個人中心、 評論分享、搜尋四大功能。下面就我以我開發的一款程式設計學習的App[程式設計線上]為例, UI

利用Python+ADB打造自動點贊和抽獎機制!這款項目值多少錢?

adb 漢語 pen stat sdcard -i enc 路徑和 備忘錄 為什麽要做這個呢? 鑒於之前已經有同學實現了自動挖掘抖音美女的案例,所以這個想法終於有了一絲付諸實踐的曙光,潘老師和這位同學一樣使用了Python+ADB的方式來實現。 Python

跨平臺(多家soC平臺)多特性元件化IPC軟體

構想:為IP攝像機定做一款軟體,先基於GM/TI/Hisi平臺,未來會相容更多平臺。名稱叫:IPC-Guarder IPC-guarder將實現如下功能: Funcitions list: Liveview:local liveview(BNC out), network liveview

利用Python打造了身份證生成器!請問警察叔叔會聘用我嗎?

今天收到一個小需求:需要一個自動生成身份證號碼的小程式。近期用python較多,因此打算用python實現 需求細化: 1.身份證必須能夠通過身份證校驗程式。 2.通過查詢,發現身份證號碼是有國家標準的,標準號為 GB 11643-1999 可以從百度下載到這個文件 下載:GB116

基於adt-bundle-windows-x86-20140702_2的Android新建一個Android工程(利用第三方模擬器)

新手建議先下載: adt-bundle-windows-x86-20140702_2 連結:https://pan.baidu.com/s/1wS7-wXKxpH1VeYsXsABeHQ 密碼:yzz

【原創】關於視訊播放器如何做到邊播邊快取?【如何用Vitamio功能強大的視訊播放器補充篇】

上一篇介紹了怎樣做一款功能強大的視訊播放器,是基於Vitamio框架開發的。這裡我們再補充一個功能:如何做到視訊邊播放邊快取到本地? 這個需求還挺常見的。由於使用者的網路環境複雜,經常會有網速較慢看視訊時卡頓、緩衝的現象,並且有時候我們需要頻繁的拖拽進度條,如果播放的是

Android利用Shareinstall進行多渠道鍵自動打包!

目前國內的安卓渠道有幾百家,我們要根據不同的渠道打不同渠道的apk來統計每個渠道帶來的使用者數,統計每個渠道使用者的存活率和活躍度等等資訊,但是手動對每個渠道的APK進行簽名打包實在是讓人感到厭煩且低效,這時我們需要一個全自動化的打包工具----Shareins

教你可以賺錢的iPhone APP》02

首先介紹一下開發一款蘋果手機的APP需要的工具 1.     需要一臺裝有蘋果系統(Mac系統)的電腦。如下的電腦均可: iMac Mac Pro MacBook Mac mini 2.     軟體Xcode。 安裝方法: 開啟Mac系統裡自帶的Ap

教你可以賺錢的iPhone APP》03

第1部分 故事的基礎要素 - 程式語言的基礎部分 故事的基礎要素一般包括文字,語句,標點符號等。與之類似,我們這一部分介紹程式語言Swift的基礎部分。 1 變數與常量  1.1 概念通俗講解  變數是指可以變化的量。常量是指不可以變化的量。  以人舉例,人的性

教你可以賺錢的iPhone APP》22

第2部分 故事的進階要素 - 程式語言Swift的進階部分 10 方法 10.1 概念通俗講解 方法是一種特殊的函式,在類或者結構體裡的函式叫方法。其實方法的本質就是函式,只不過它是在類裡,結構體裡使用

教你可以賺錢的iPhone APP》25

第2部分 故事的進階要素 - 程式語言Swift的進階部分 13 擴充套件 13.1 概念通俗講解 擴充套件的作用是為已存在的類、結構體、列舉或者協議型別新增新的功能。 例如,String是一個結構體,

教你可以賺錢的iPhone APP》28

第2部分 故事的進階要素 - 程式語言Swift的進階部分 16 委託 16.1 概念通俗講解 委託是一種設計模式,它使類或結構體通過協議能夠將其某些職責委託給另一個類或結構體,讓另一個類或結構體幫它實

教你可以賺錢的iPhone APP》29

第2部分 故事的進階要素 - 程式語言Swift的進階部分 17 訪問控制 17.1 概念通俗講解 Swift提供了5個訪問級別 open, public, internal, fileprivate,

教你可以賺錢的iPhone APP》30

第2部分 故事的進階要素 - 程式語言Swift的進階部分 18 型別轉換 18.1 概念通俗講解 型別轉換就是轉換當前常量,變數,例項的型別。例如Int型別轉換為String 18.2 定義簡潔介紹 下面介紹4個常用的使用場景 1).普通資料轉換 - 用構造方

仿映客的直播App?看我就夠了

一、直播現狀簡介 Linkee.10 1.技術實現層面: 技術相對都比較成熟,裝置也都支援硬編碼。IOS還提供現成的 Video ToolBox框架,可以對攝像頭和流媒體資料結構進行處理,但Video ToolBox框架只相容8.0以上版本,8.0以下就需要用x264的庫

Android FrameWork整合第三方SDK的jar包和so庫

   本文講解的如何在Android FrameWork如何整合XXXsdk的jar包和so庫    首先在framework/opt/建立XXSDK的資料夾講jar包和so庫拷貝進去        1:framework/opt/xxsdk/