阿里雲移動端播放器高級功能---視頻下載

基本介紹

優酷、愛奇藝、騰訊等主流的視頻類App都有視頻離線下載的功能,主要目的是在wifi下將視頻離線在本地,而後在無網或者4G的狀況下去觀看離線視頻。那麼阿里雲播放器也提供了視頻下載的功能。這個功能主要針對的是點播視頻,也就是vid播放的視頻的下載。html

主要問題

  1. m3u8如何下載?咱們知道m3u8是一個索引文件,真正的視頻文件是各個ts的分片,那麼如何下載成一個完成的視頻呢?
  2. 如何對視頻下載進行多線程控制?在一些app中,多個視頻同時下載被認爲是高級VIP纔有的功能。
  3. 如何實現斷點續傳?當在下載過程當中忽然中斷了,那麼下次再啓動的時候要可以實現續傳。
  4. 下載過程當中sts等信息過時怎麼處理?
  5. 加密的視頻下載到本地如何保障安全性呢?

實現原理

下載過程

阿里雲播放器支持mp4文件和m3u8視頻文件兩種格式下載。其下載過程基本一致。流程圖以下:
4a0e27a902c485805d28626bcf2aece570cdc30b
從上述流程圖中能夠看到,m3u8文件的下載咱們會mux成一個mp4文件,首先將各個ts文件分別下載,最後的過程當中再進行mux。數組

多線程控制

/*
 功能:設置同時下載的數量,最大4個
 參數:count:同時下載的個數
 */
-(void)setMaxDownloadOperationCount:(int)count;

經過上述的接口,能夠設置並行下載的個數。當添加到隊列中的數量多於這個設定的個數後,會在隊列中進行等待,當以前的下載完成後會自動進行下一個視頻的下載。安全

異常中斷

常常有的狀況是:不當心將app殺掉了,或者手機沒電關機了等其餘中斷的因素。這個時候下次下載的時候要可以恢復以前的現場。咱們提供了一個回調來通知app:微信

/*
 功能:未完成回調,異常中斷致使下載未完成,下次啓動後會接收到此回調。
 回調數據:AliyunDownloadMediaInfo數組
 */
-(void) onUnFinished:(NSArray<AliyunDataSource*>*)mediaInfos;

過時處理

經過vid的方式進行下載,一樣支持vid+playAuth,vid+sts,vid+mps的方式進行播放,將這些信息添加到隊列中,若是以前一個視頻下載時間較長,那麼後面排隊的視頻的輸入信息可能會過時。針對這種狀況,咱們增長了過時的回調來從新輸入信息:多線程

/*
  功能:開始下載後收到回調,更新最新的playAuth。主要場景是開始多個下載時,等待下載的任務自動開始下載後,playAuth有可能已通過期了,需經過此回調更新
 參數:返回當前數據
 返回:使用代理方法,設置playauth來更新數據。
 備註:如經過請求數據來獲取playAuth,請使用同步方法。此代理方法在其餘線程裏,不會存在卡線程問題。
  */
-(NSString*)onGetPlayAuth:(NSString*)vid format:(NSString*)format quality:(AliyunVodPlayerVideoQuality)quality;


/*
  功能:開始下載後收到回調,更新最新的stsData。主要場景是開始多個下載時,等待下載的任務自動開始下載後,stsData有可能已通過期了,需經過此回調更新
 參數:返回當前數據
 返回:使用代理方法,設置AliyunStsData來更新數據。
 備註:如經過請求數據來獲取stsData,請使用同步方法。此代理方法在其餘線程裏,不會存在卡線程問題。
 */
- (AliyunStsData*)onGetAliyunStsData:(NSString *)videoID
                              format:(NSString*)format
                             quality:(AliyunVodPlayerVideoQuality)quality;

/*
  功能:開始下載後收到回調,更新最新的MtsData。主要場景是開始多個下載時,等待下載的任務自動開始下載後,MtsData有可能已通過期了,需經過此回調更新
 參數:返回當前數據
 返回:使用代理方法,設置AliyunMtsData來更新數據。
 備註:如經過請求數據來獲取mtsData,請使用同步方法。此代理方法在其餘線程裏,不會存在卡線程問題。
 */
- (AliyunMtsData*)onGetAliyunMtsData:(NSString *)videoID
                              format:(NSString*)format
                             quality:(NSString *)quality;

加密下載

加密下載到本地,如何保證安全呢?有幾個問題就是下載後咱們須要從新加密,防止密鑰泄露。同時另一個就是要防止視頻被拷貝到其餘app中進行播放。好比存在下面的場景。
08cb7ed198a10ef5a2dc598c57924253d14e097e
因此咱們經過將用戶密鑰和用戶app綁定的方式來保證安全性。
那麼如何來作呢?app

控制檯配置

若是但願實現加密下載,須要在阿里雲控制檯配置下載選項爲安全下載。同時,填寫校驗及加密相關信息。截圖以下:
1f550628bd1bc01e3c72da3bab8fb9e80e65b0bf
填寫完成以後,控制檯將會生成一個dat校驗文件。這個校驗文件須要配置到阿里雲下載模塊中,供校驗使用。ide

使用dat文件

有了dat文件後,咱們將文件設置到播放器中,經過以下接口:this

/*
  功能:設置加密文件
  參數:encrptyFile爲加密文件路徑
  */
-(void)setEncrptyFile:(NSString*)encrptyFile;

下載功能示例

以Android爲例,Android 提供了AliyunDownloadManager這個單例類實現下載功能。阿里雲

配置AliyunDownloadConfig

下載以前,須要配置AliyunDownloadConfig。AliyunDownloadConfig中須要配置以下幾個參數:加密

  • setMaxNums: 設置最大同時下載的個數。
  • setDownloadDir: 設置下載的文件保存的位置。
  • setSecretImagePath: 設置校驗文件的路徑。 其中:setSecretImagePath只須要在加密下載的時候設置。其他兩個參數均須要設置。

獲取視頻信息並下載

阿里雲播放器支持 STS ,AUTH,MPS 等多種方式下載。以STS舉例。
1. 經過sts信息,調用prepare接口,獲取能夠下載的視頻項:

//1.設置下載監聽
  downloadManager = AliyunDownloadManager.getInstance(getContext());
  downloadInfoListener = new MyDownloadInfoListener(this);
  downloadManager.addDownloadInfoListener(downloadInfoListener);
  //2.使用vidsts準備下載資源。
   AliyunVidSts adb = new AliyunVidSts();
        adb.setVid(mVid);
        adb.setAcId(akid);
        adb.setAkSceret(akSecret);
        adb.setSecurityToken(token);
        downloadManager.prepareDownloadMedia(adb);
  1. prepare成功後,添加某一項到AliyunDownloadManager中,並開始下載:
@Override
  void onPrepared(List<AliyunDownloadMediaInfo> infos) {
        //準備結束
        downloadManager.addDownloadMedia(infos.get(0));
        downloadManager.startDownloadMedia(info);
    }
  1. 接受下載回調,更新界面:
@Override
        public void onPrepared(List<AliyunDownloadMediaInfo> infos) {
          //準備完成
        }

        @Override
        public void onStart(AliyunDownloadMediaInfo info) {
          //下載開始
        }

        @Override
        public void onProgress(AliyunDownloadMediaInfo info, int percent) {
            //下載進度
        }

        @Override
        public void onStop(AliyunDownloadMediaInfo info) {
          //下載中止
        }

        @Override
        public void onCompletion(AliyunDownloadMediaInfo info) {
            DemoDownloadActivity downloadActivity = weakActivity.get();
            if (downloadActivity != null) {
                downloadActivity.onCompletion(info);
            }
        }

        @Override
        public void onError(AliyunDownloadMediaInfo info, int code, String msg, String reuqestId) {
            //下載出錯
        }

        @Override
        public void onWait(AliyunDownloadMediaInfo outMediaInfo) {
            //等待下載
        }

移除下載項

AliyunDownloadManager提供了移除接口,用來從下載管理中移除下載。移除以後,下載的文件將也會被刪除。

downloadManager.removeDownloadMedia(info);

具體使用示例,可參考官網demo

 

原文連接 更多技術乾貨 請關注阿里云云棲社區微信號 :yunqiinsight

相關文章
相關標籤/搜索