優酷、愛奇藝、騰訊等主流的視頻類App都有視頻離線下載的功能,主要目的是在wifi下將視頻離線在本地,而後在無網或者4G的狀況下去觀看離線視頻。那麼阿里雲播放器也提供了視頻下載的功能。這個功能主要針對的是點播視頻,也就是vid播放的視頻的下載。html
阿里雲播放器支持mp4文件和m3u8視頻文件兩種格式下載。其下載過程基本一致。流程圖以下:
從上述流程圖中能夠看到,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中進行播放。好比存在下面的場景。
因此咱們經過將用戶密鑰和用戶app綁定的方式來保證安全性。
那麼如何來作呢?app
若是但願實現加密下載,須要在阿里雲控制檯配置下載選項爲安全下載
。同時,填寫校驗及加密相關信息。截圖以下:
填寫完成以後,控制檯將會生成一個dat校驗文件。這個校驗文件須要配置到阿里雲下載模塊中,供校驗使用。ide
有了dat文件後,咱們將文件設置到播放器中,經過以下接口:this
/* 功能:設置加密文件 參數:encrptyFile爲加密文件路徑 */ -(void)setEncrptyFile:(NSString*)encrptyFile;
以Android爲例,Android 提供了AliyunDownloadManager
這個單例類實現下載功能。阿里雲
AliyunDownloadConfig
下載以前,須要配置AliyunDownloadConfig
。AliyunDownloadConfig中須要配置以下幾個參數:加密
阿里雲播放器支持 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);
@Override void onPrepared(List<AliyunDownloadMediaInfo> infos) { //準備結束 downloadManager.addDownloadMedia(infos.get(0)); downloadManager.startDownloadMedia(info); }
@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