安全下载

阿里云播放器SDK的安全下载功能,可使视频下载到本地时经密钥文件进行加密,让其仅能通过预先绑定的唯一App生成的密钥文件进行解密播放,可有效保护视频内容,防止下载到本地的视频被恶意播放或传播。本文为您介绍如何在Android端或iOS端使用阿里云播放器SDK进行安全下载。

功能简介

视频点播服务针对移动端的使用场景,提供了视频下载功能。视频下载分为安全下载和普通下载两种方式,具体区别如下:

  • 安全下载(推荐):允许用户通过移动端阿里云播放器将视频缓存至本地观看,但下载到本地的视频文件会使用生成的密钥文件进行加密,仅支持使用阿里云播放器进行解密播放;使用第三方播放器或未经解密,都将无法观看视频。

  • 普通下载:允许用户通过移动端阿里云播放器将视频缓存至本地观看,且下载到本地的视频文件未经加密,可拷贝,也可使用任意播放器播放,请谨慎使用

安全下载可确保下载的视频为加密视频,且仅能通过预先绑定的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];