阿里云播放器SDK的安全下载功能,可使视频下载到本地时经密钥文件进行加密,让其仅能通过预先绑定的唯一App生成的密钥文件进行解密播放,可有效保护视频内容,防止下载到本地的视频被恶意播放或传播。本文为您介绍如何在Android端或iOS端使用阿里云播放器SDK进行安全下载。
功能简介
视频点播服务针对移动端的使用场景,提供了视频下载功能。视频下载分为普通下载和安全下载两种方式,具体区别如下:
安全下载(推荐):允许用户通过移动端阿里云播放器将视频缓存至本地观看,但下载到本地的视频文件会使用生成的密钥文件进行加解密,仅支持使用阿里云播放器进行解密播放;使用第三方播放器或未经解密,都将无法观看视频。
普通下载:允许用户通过移动端阿里云播放器将视频缓存至本地观看,且下载到本地的视频文件未经加密,可拷贝,也可使用任意播放器播放,请谨慎使用。
安全下载可确保下载的视频为加密视频,且仅能通过预先绑定的App(通过在点播控制台生成密钥文件时填写APP唯一标识进行App绑定)进行播放。相比普通下载更加安全可靠,适用于需要保护视频版权的使用场景,非特殊场景下,都推荐您使用安全下载方式,
使用限制
安全下载功能集成在阿里云播放器SDK内,使用安全下载功能需要结合阿里云播放器SDK使用。
目前阿里云播放器SDK仅VidSts和VidAuth方式支持安全下载功能。
安全下载下来的视频会在本地加密,且只能使用预先绑定的App以阿里云播放器SDK的URL方式进行视频播放。
前提条件
您已经开通了视频点播服务。开通步骤请参见开通视频点播。
您已经在视频点播控制台开启下载功能并配置下载方式为安全下载,详细操作请参见安全下载。
您已经集成阿里云播放器SDK,详细操作请参见集成Android端播放器SDK或集成iOS端播放器SDK。
Android端关键实现
安全下载设置
配置安全下载的加密校验文件。
需要将在点播控制台生成的密钥文件配置到播放器SDK中,用于视频下载和播放的解密验证,密钥文件的生成请参见安全下载。
说明请确保配置的加密校验文件与预先绑定的App信息一致,否则会导致视频下载失败。
建议在Application中配置一次即可,示例如下:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat所在的文件路径"); //建议将encryptedApp.dat加密校验文件存放到手机中后,此处设置加密校验文件的手机本地文件路径
创建并设置下载器。
创建下载器,通过AliDownloaderFactory创建。示例如下:
AliMediaDownloader mAliDownloader = null; ...... //创建下载器 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); //配置下载保存的路径 mAliDownloader.setSaveDir("保存的文件夹地址");
设置监听事件。
下载器提供了多个事件监听。示例如下:
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() { //下载成功 } });
准备下载源。
通过
prepare
方法准备下载源。下载源支持VidSts和VidAuth两种方式。示例如下:VidSts
//创建VidSts VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("Vid信息");//视频ID(VideoId) aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");//鉴权ID aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>");//鉴权密钥 aliyunVidSts.setSecurityToken("<yourSecurityToken>");//安全token aliyunVidSts.setRegion("接入地域");//点播服务的接入地域,默认为cn-shanghai //准备下载源 mAliDownloader.prepare(aliyunVidSts)
VidAuth
//创建VidAuth VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid信息");//视频ID(VideoId) vidAuth.setPlayAuth("<yourPlayAuth>");//播放凭证 vidAuth.setRegion("接入地域");//点播服务的接入地域,默认为cn-shanghai //准备下载源 mAliDownloader.prepare(vidAuth);
说明源文件格式与输出的下载文件格式保持一致,不支持更改。
准备成功后,选择下载项并开始下载。
准备成功后,会回调
OnPreparedListener
方法。返回的TrackInfo中会包含各视频流的清晰度等信息,请选择一个Track进行下载,示例如下:public void onPrepared(MediaInfo mediaInfo) { //准备下载项成功 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); //比如:下载第一个TrackInfo mAliDownloader.selectItem(trackInfos.get(0).getIndex()); //开始下载 mAliDownloader.start(); }
(可选)更新下载源。
为了防止VidSts和VidAuth过期,您也可以更新下载源的信息后开始下载。示例如下:
//更新下载源 mAliDownloader.updateSource(VidSts); //开始下载 mAliDownloader.start();
下载成功或失败后,释放下载器。
下载成功后,在
onCompletion
或者onError
回调中调用release
释放下载器。示例如下:mAliDownloader.stop(); mAliDownloader.release();
可选:删除下载的文件。
下载过程中,或者下载完成后,可以删除下载的文件。示例如下:
//通过对象删除文件 mAliDownloader.deleteFile(); //通过静态方法删除,若删除成功则返回0 AliDownloaderFactory.deleteFile("待删除的下载文件夹路径","视频ID","视频格式","下载的视频索引");
下载后播放
通过安全下载方式下载到本地的视频,仅支持使用阿里云播放器SDK以URL方式进行解密播放,具体方法如下:
下载完成后获取视频文件的绝对路径。
String path = mAliDownloader.getFilePath();
通过点播UrlSource方式设置绝对路径进行播放。
UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");//设置下载视频的绝对路径。 aliPlayer.setDataSource(urlSource);
iOS端关键实现
安全下载设置
配置安全下载的加密校验文件。
需要将在点播控制台生成的密钥文件配置到播放器SDK中,用于视频下载和播放的解密验证,密钥文件的生成请参见安全下载。
说明请确保配置的加密校验文件与预先绑定的App信息一致,否则会导致视频下载失败。
建议在Application中配置一次即可,示例如下:
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];
创建并设置下载器。
示例如下:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];
设置监听事件。
下载器提供了多个事件监听。示例如下:
-(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 { //下载成功 }
准备下载源。
通过
prepare
方法准备下载源。下载源支持AVPVidStsSource和AVPVidAuthSource两种。以AVPVidStsSource举例,示例如下:AVPVidStsSource
//创建VidSts AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"接入地域"; // 点播服务的接入地域,默认为cn-shanghai stsSource.vid = @"Vid信息"; // 视频ID(VideoId) stsSource.securityToken = @"<yourSecurityToken>"; // 安全token stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // 鉴权密钥 stsSource.accessKeyId = @"<yourAccessKeyId>"; // 鉴权ID //准备下载源 [downloader prepareWithVid:stsSource];
AVPVidAuthSource
//创建VidAuth AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Vid信息"; // 视频ID(VideoId) authSource.playAuth = @"<yourPlayAuth>"; // 播放凭证 authSource.region = @"接入地域"; // 点播服务的接入地域,默认为cn-shanghai //准备下载源 [downloader prepareWithVid:authSource];
准备成功后,选择下载项。
准备成功后,会回调
onPrepared
方法。返回的TrackInfo中会包含各视频流的清晰度等信息,请选择一个Track进行下载,示例如下:-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; //比如:下载第一个TrackInfo [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }
更新下载源并开始下载。
为了防止VidSts和VidAuth过期,建议更新下载源的信息后开始下载。示例如下:
//更新下载源 [downloader updateWithVid:vidSource] //开始下载 [downloader start];
下载成功或失败后,释放下载器。
下载成功后,调用
destroy
释放下载器。[self.downloader destroy]; self.downloader = nil;
下载后播放
通过安全下载方式下载到本地的视频,仅支持使用阿里云播放器SDK以URL方式进行解密播放,具体方法如下:
下载完成后获取视频文件的绝对路径。
说明由于iOS沙盒路径机制,建议您取到沙盒目录下自定义设置的下载保存路径,取得
downloadedFilePath
中的自定义设置的下载保存路径+生成的文件名字,拼接上当前获取的沙盒目录,生成新的视频文件路径。NSString *downloadedFilePath = downloader.downloadedFilePath;
通过点播UrlSource方式设置绝对路径进行播放。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:downloadedFilePath]; [self.player setUrlSource:urlSource];