阿里云移动推送服务怎么用 (阿里云点播上传视频方式)

基本介绍

优酷、爱奇艺、腾讯等主流的视频类App都有视频离线*载下**的功能,主要目的是在wifi下将视频离线在本地,然后在无网或者4G的情况下去观看离线视频。那么阿里云*放播**器也提供了视频*载下**的功能。这个功能主要针对的是点播视频,也就是vid*放播**的视频的*载下**。

主要问题

  1. m3u8如何*载下**?我们知道m3u8是一个索引文件,真正的视频文件是各个ts的分片,那么如何*载下**成一个完成的视频呢?
  2. 如何对视频*载下**进行多线程控制?在一些app中,多个视频同时*载下**被认为是高级VIP才有的功能。
  3. 如何实现断点续传?当在*载下**过程中突然中断了,那么下次再启动的时候要能够实现续传。
  4. *载下**过程中sts等信息过期怎么处理?
  5. 加密的视频*载下**到本地如何保障安全性呢?

实现原理

*载下**过程

阿里云*放播**器支持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绑定的方式来保证安全性。

那么如何来做呢?

控制台配置

如果希望实现加密*载下**,需要在阿里云控制台配置*载下**选项为安全*载下**。同时,填写校验及加密相关信息。截图如下:

阿里云内置播放器,阿里云挂载安卓电视

填写完成之后,控制台将会生成一个dat校验文件。这个校验文件需要配置到阿里云*载下**模块中,供校验使用。

使用dat文件

有了dat文件后,我们将文件设置到*放播**器中,通过如下接口:

/*

功能:设置加密文件

参数:encrptyFile为加密文件路径

*/

-(void)setEncrptyFile:(NSString*)encrptyFile;

*载下**功能示例

以Android为例,Android 提供了AliyunDownloadManager这个单例类实现*载下**功能。

配置AliyunDownloadConfig

*载下**之前,需要配置AliyunDownloadConfig。AliyunDownloadConfig中需要配置如下几个参数:

  • setMaxNums: 设置最大同时*载下**的个数。
  • setDownloadDir: 设置*载下**的文件保存的位置。
  • setSecretImagePath: 设置校验文件的路径。 其中:setSecretImagePath只需要在加密*载下**的时候设置。其余两个参数均需要设置。

获取视频信息并*载下**

阿里云*放播**器支持 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);

  1. prepare成功后,添加某一项到AliyunDownloadManager中,并开始*载下**:
 @Override
 void onPrepared(List<AliyunDownloadMediaInfo> infos) {
 //准备结束
 downloadManager.addDownloadMedia(infos.get(0));
 downloadManager.startDownloadMedia(info);
 }
  1. 接受*载下**回调,更新界面:
 @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