全部產品
Search
文件中心

ApsaraVideo VOD:安全下載

更新時間:Jul 13, 2024

阿里雲播放器SDK的安全下載功能,可使視頻下載到本地時經密鑰檔案進行加密,讓其僅能通過預先綁定的唯一App產生的密鑰檔案進行解密播放,可有效保護視頻內容,防止下載到本地的視頻被惡意播放或傳播。本文為您介紹如何在Android端或iOS端使用阿里雲播放器SDK進行安全下載。

功能簡介

ApsaraVideo for VOD服務針對移動端的使用情境,提供了視頻下載功能。視頻下載分為安全下載和普通下載兩種方式,具體區別如下:

  • 安全下載(推薦):允許使用者通過移動端阿里雲播放器將視頻緩衝至本地觀看,但下載到本地的視頻檔案會使用產生的密鑰檔案進行加密,僅支援使用阿里雲播放器進行解密播放;使用第三方播放器或未經解密,都將無法觀看視頻。

  • 普通下載:允許使用者通過移動端阿里雲播放器將視頻緩衝至本地觀看,且下載到本地的視頻檔案未經加密,可拷貝,也可使用任意播放器播放,請謹慎使用

安全下載可確保下載的視頻為加密視頻,且僅能通過預先綁定的App(通過在點播控制台產生密鑰檔案時填寫APP唯一標識進行App綁定)進行播放。相比普通下載更加安全可靠,適用於需要保護視頻著作權的使用情境,非特殊情境下,都推薦您使用安全下載方式。

使用限制

  • 安全下載功能整合在阿里雲播放器SDK內,使用安全下載功能需要結合阿里雲播放器SDK使用。

  • 目前阿里雲播放器SDK僅VidSts和VidAuth方式支援安全下載功能。

  • 安全下載下來的視頻會在本地加密,且只能使用預先綁定的App以阿里雲播放器SDK的URL方式進行視頻播放。

前提條件

Android端關鍵實現

安全下載設定

  1. 配置安全下載的加密校正檔案。

    將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載的加密和視頻播放的解密,密鑰檔案的產生請參見安全下載

    說明

    請確保配置的加密校正檔案與預先綁定的App資訊一致,否則會導致視頻下載失敗。

    建議在Application中配置一次即可,樣本如下:

    PrivateService.initService(getApplicationContext(),  "encryptedApp.dat所在的檔案路徑"); //建議將encryptedApp.dat加密校正檔案存放到手機中後,此處設定加密校正檔案的手機本地檔案路徑
  2. 建立並設定下載器。

    建立下載器,通過AliDownloaderFactory建立。樣本如下:

    AliMediaDownloader mAliDownloader = null;
    ......
    //建立下載器
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    //配置下載儲存的路徑
    mAliDownloader.setSaveDir("儲存的檔案夾地址");
  3. 設定監聽事件。

    下載器提供了多個事件監聽。樣本如下:

    展開查看代碼

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           //準備下載項成功
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           //下載進度百分比
       }
       @Override
       public void onProcessingProgress(int percent) {
           //處理進度百分比
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           //下載出錯
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           //下載成功
       }
    });
  4. 準備下載源。

    通過prepare方法準備下載源。下載源支援VidSts和VidAuth兩種方式。樣本如下:

    • VidSts

      //建立VidSts
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Vid資訊");// 視頻ID(VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");// STS臨時AK對的存取金鑰ID,需要調用STS服務的AssumeRole介面產生。
      aliyunVidSts.setAccessKeySecret"<yourAccessKeySecret>");// STS臨時AK對的存取金鑰,需要調用STS服務的AssumeRole介面產生。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>");// STS安全性權杖,需要調用STS服務的AssumeRole介面產生。
      aliyunVidSts.setRegion("接入地區");// 點播服務的接入地區,預設為cn-shanghai。
      //準備下載源
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      //建立VidAuth
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("Vid資訊");// 視頻ID(VideoId)。
      vidAuth.setPlayAuth("<yourPlayAuth>");// 播放憑證,需要調用點播服務的GetVideoPlayAuth介面產生。
      vidAuth.setRegion("接入地區");// 5.5.5.0及之後版本播放器SDK,本參數已棄用,無需設定region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數必選,點播服務的接入地區,預設為cn-shanghai。
      //準備下載源
      mAliDownloader.prepare(vidAuth);
    說明

    源檔案格式與輸出的下載檔案格式保持一致,不支援更改。

  5. 準備成功後,選擇下載項並開始下載。

    準備成功後,會回調OnPreparedListener方法。返回的TrackInfo中會包含各視頻流的清晰度等資訊,請選擇一個Track進行下載,樣本如下:

    public void onPrepared(MediaInfo mediaInfo) {
        //準備下載項成功
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        //比如:下載第一個TrackInfo
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        //開始下載
        mAliDownloader.start();
    }
  6. (可選)更新下載源。

    為了防止VidSts和VidAuth到期,您也可以更新下載源的資訊後開始下載。樣本如下:

    //更新下載源
    mAliDownloader.updateSource(VidSts);
    //開始下載
    mAliDownloader.start();
  7. 下載成功或失敗後,釋放下載器。

    下載成功後,在onCompletion或者onError回調中調用release釋放下載器。樣本如下:

    mAliDownloader.stop();
    mAliDownloader.release();
  8. 可選:刪除下載的檔案。

    下載過程中,或者下載完成後,可以刪除下載的檔案。樣本如下:

    //通過對象刪除檔案
    mAliDownloader.deleteFile();
    //通過靜態方法刪除,若刪除成功則返回0
    AliDownloaderFactory.deleteFile("待刪除的下載檔案夾路徑","視頻ID","視頻格式","下載的視頻索引");

下載後播放

通過安全下載方式下載到本地的視頻,僅支援使用阿里雲播放器SDK以URL方式進行解密播放,具體方法如下:

  1. 下載完成後擷取視頻檔案的絕對路徑。

    String path = mAliDownloader.getFilePath();
  2. 通過點播UrlSource方式設定絕對路徑進行播放。

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("播放地址");//設定下載視頻的絕對路徑。
            aliPlayer.setDataSource(urlSource);

iOS端關鍵實現

安全下載設定

  1. 配置安全下載的加密校正檔案。

    需要將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載的加密和視頻播放的解密,密鑰檔案的產生請參見安全下載

    說明

    請確保配置的加密校正檔案與預先綁定的App資訊一致,否則會導致視頻下載失敗。

    建議在Application中配置一次即可,樣本如下:

    NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"];
    [AliPrivateService initKey:encrptyFilePath];
  2. 建立並設定下載器。

    樣本如下:

    AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init];
    [downloader setSaveDirectory:self.downLoadPath];
    [downloader setDelegate:self];
  3. 設定監聽事件。

    下載器提供了多個事件監聽。樣本如下:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        //準備下載項成功
    }
    -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel {
        //下載出錯
    }
    -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        //下載進度百分比
    }
    -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        //處理進度百分比
    }
    -(void)onCompletion:(AliMediaDownloader *)downloader {
        //下載成功
    }
  4. 準備下載源。

    通過prepare方法準備下載源,支援VidSts和VidAuth兩種方式。樣本如下:

    • VidSts

      //建立VidSts
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"接入地區"; // 點播服務的接入地區,預設為cn-shanghai。
      stsSource.vid = @"Vid資訊"; // 視頻ID(VideoId)。
      stsSource.securityToken = @"<yourSecurityToken>"; // STS安全性權杖,需要調用STS服務的AssumeRole介面產生。
      stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // STS臨時AK對的存取金鑰,需要調用STS服務的AssumeRole介面產生。
      stsSource.accessKeyId = @"<yourAccessKeyId>"; // STS臨時AK對的存取金鑰ID,需要調用STS服務的AssumeRole介面產生。
      //準備下載源
      [downloader prepareWithVid:stsSource];
    • VidAuth

      //建立VidAuth
      AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
      authSource.vid = @"Vid資訊"; // 視頻ID(VideoId)。
      authSource.playAuth = @"<yourPlayAuth>"; // 播放憑證,需要調用點播服務的GetVideoPlayAuth介面產生。
      authSource.region = @"接入地區"; // 5.5.5.0及之後版本播放器SDK,本參數已棄用,無需設定region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數必選,點播服務的接入地區,預設為cn-shanghai。
      //準備下載源
      [downloader prepareWithVid:authSource];
  5. 準備成功後,選擇下載項。

    準備成功後,會回調onPrepared方法。返回的TrackInfo中會包含各視頻流的清晰度等資訊,請選擇一個Track進行下載,樣本如下:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        NSArray<AVPTrackInfo*>* tracks = info.tracks;
        //比如:下載第一個TrackInfo
        [downloader selectTrack:[tracks objectAtIndex:0].trackIndex];
    }
  6. 更新下載源並開始下載。

    為了防止VidSts和VidAuth到期,建議更新下載源的資訊後開始下載。樣本如下:

    //更新下載源
    [downloader updateWithVid:vidSource]
    //開始下載
    [downloader start];
  7. 下載成功或失敗後,釋放下載器。

    下載成功後,調用destroy釋放下載器。

    [self.downloader destroy];
    self.downloader = nil;

下載後播放

通過安全下載方式下載到本地的視頻,僅支援使用阿里雲播放器SDK以URL方式進行解密播放,具體方法如下:

  1. 下載完成後擷取視頻檔案的絕對路徑。

    說明

    由於iOS沙箱路徑機制,建議您取到沙箱目錄下自訂設定的下載儲存路徑,取得downloadedFilePath中的自訂設定的下載儲存路徑+產生的檔案名稱字,拼接上當前擷取的沙箱目錄,產生新的視頻檔案路徑。

    NSString *downloadedFilePath = downloader.downloadedFilePath;
  2. 通過點播UrlSource方式設定絕對路徑進行播放。

    AVPUrlSource *urlSource = [[AVPUrlSource alloc] 
    urlWithString:downloadedFilePath];
    [self.player setUrlSource:urlSource];