阿里云移动端播放器高级功能---视频下载

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

基本介绍

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

主要问题

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

实现原理

下载过程

阿里云播放器支持mp4文件和m3u8视频文件两种格式下载。其下载过程基本一致。流程图如下:
4a0e27a902c485805d28626bcf2aece570cdc30b
从上述流程图中可以看到,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中进行播放。比如存在下面的场景。
08cb7ed198a10ef5a2dc598c57924253d14e097e
所以我们通过将用户密钥和用户app绑定的方式来保证安全性。
那么如何来做呢?

控制台配置

如果希望实现加密下载,需要在阿里云控制台配置下载选项为安全下载。同时,填写校验及加密相关信息。截图如下:
1f550628bd1bc01e3c72da3bab8fb9e80e65b0bf
填写完成之后,控制台将会生成一个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

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
7月前
|
移动开发 监控 小程序
mPaaS常见问题之音视频通话微信小程序通话界面录制为画中画模式如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
104 0
|
4月前
|
编解码 Linux 开发工具
大牛直播SDK跨平台RTMP直播推送模块技术设计和功能列表
大牛直播SDK是一款跨平台RTMP直播推送模块,支持Windows、Linux(x64_64与aarch64架构)、Android及iOS平台。该SDK功能全面,包括摄像头、屏幕、麦克风等数据采集与推送,并支持编码前后数据对接。其架构设计优秀,确保低延迟与高效率,结合SmartPlayer播放器实现毫秒级延迟体验。具备全自研框架,易于扩展且支持多种数据源接入,如外部YUV/RGB/H.264等格式。此外,各平台支持特性丰富,如Windows平台支持多摄像头合成,Android与iOS平台支持前后摄像头实时切换等。大牛直播SDK还提供了多个示例项目以帮助开发者快速上手。
100 0
|
6月前
|
Web App开发 移动开发 编解码
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
本文讨论了实时数据传输在互联网中的重要性,如即时通讯和在线直播。一对一通信通常使用WebRTC技术,但一对多直播需要流媒体服务器和特定协议,如RTSP、RTMP、SRT或RIST。RTMP由于其稳定性和早期普及,成为国内直播的主流。文章通过实例演示了如何使用OBS Studio和RTMP Streamer进行RTMP推流,并对比了不同流媒体传输协议的优缺点。推荐了两本关于FFmpeg和Android开发的书籍以供深入学习。
104 0
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
|
7月前
多功能在线二维码生成源码
上传即可使用,可以把电子名片、文本、wifi网络、电子邮件、短信、电话号码、网址等信息生成对应的二维码图片。
118 24
多功能在线二维码生成源码
|
7月前
|
Web App开发
Star 5.5k!这款Web剪藏工具绝了,支持10+平台内容剪辑同步!
Star 5.5k!这款Web剪藏工具绝了,支持10+平台内容剪辑同步!
|
开发工具
Queen智能美化特效SDK需要高级美颜、常见美型、美体这样是属于按版本买,还是按客户端计费?
Queen智能美化特效SDK需要高级美颜、常见美型、美体这样是属于按版本买,还是按客户端计费?
68 1
|
7月前
|
小程序
微信小程序音频后台播放功能
微信小程序音频后台播放功能
620 0
|
数据采集 物联网 Linux
Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)
随着物联网等行业的崛起,越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等,对Linux下的生态构建,有了更大的期望,Linux平台下,可选的直播推拉流解决方案相对Windows和移动端,非常少,基于Unity的Linux推送方案,更是几无参考。本文以Unity3d环境下Linux平台推送Unity窗体和Unity采集的音频,然后编码推送到RTMP服务器为例,大概说下实现过程。
195 0
直播源代码包含哪些直播常用的基本功能
直播的流量变现简单有效,各直播平台的流量只增不减,使得直播行业又吸引了一批加入者,对于刚接触直播平台开发,没有经验的朋友来说,开发前了解直播源代码功能显得尤为重要,选择正确的功能,可有有效节省开发的时间和费用。
518 0
直播源代码包含哪些直播常用的基本功能
|
Web App开发 视频直播 开发工具