优酷、爱奇艺、腾讯等主流的视频类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