5. 视频下载

Polyv SDK 提供了一套视频下载的 SDK,只要导入依赖就可以直接调用,实现视频下载功能。

implementation 'com.easefun.polyv:polyvDownload:2.19.1'//SDK下载功能`

导入完成后,有几个重要的类:

  • PolyvDownloaderManager 下载管理器。里面封装了对视频下载的操作,如startAll()

  • PolyvDownloader 视频下载具体实现类。里面具体实现了下载的逻辑等。

开发者通过这几个类,基本可以实现对视频下载的控制。

1 下载设置

1.1 设置保存目录

确保在启动的 Application 中设置好下载保存目录。

PolyvSDKClient.getInstance().setDownloadDir(downloadDir);

若需要兼容旧下载视频目录,则需要设置辅助存储目录列表。新接入SDK不需要,可跳过这部分。

PolyvDevMountInfo.getInstance().init(context, new PolyvDevMountInfo.OnLoadCallback() {

    @Override
    public void callback() {
        //是否有可移除的存储介质(例如 SD 卡)或内部(不可移除)存储可供使用。
        if (!PolyvDevMountInfo.getInstance().isSDCardAvaiable()) {
            return;
        }

        //可移除的存储介质(例如 SD 卡),需要写入特定目录/storage/sdcard1/Android/data/包名/。
        ArrayList<File> subDirList = new ArrayList<>();
        String externalSDCardPath = PolyvDevMountInfo.getInstance().getExternalSDCardPath();
        if (!TextUtils.isEmpty(externalSDCardPath)) {
            StringBuilder dirPath = new StringBuilder();
            dirPath.append(externalSDCardPath).append(File.separator).append(MUITL_DOWNLOAD_DIR);
            File saveDir = new File(dirPath.toString());
            if (!saveDir.exists()) {
                saveDir.mkdirs();//创建下载目录
            }
            subDirList.add(saveDir);
        }

        //如果没有可移除的存储介质(例如 SD 卡),那么一定有内部(不可移除)存储介质可用,都不可用的情况在前面判断过了。
        File saveDir = new File(PolyvDevMountInfo.getInstance().getInternalSDCardPath() + File.separator + MUITL_DOWNLOAD_DIR);
        if (!saveDir.exists()) {
            saveDir.mkdirs();//创建下载目录
        }
        
        subDirList.add(saveDir);
        //设置"辅助存储目录列表"
        PolyvSDKClient.getInstance().setSubDirList(subDirList);
    }
}, true);

这是为了兼容旧版下载视频路径而设计。调用SDK中的接口播放视频,删除视频会从“辅助存储目录列表”中查找本地视频文件。通过设置“辅助存储目录列表”,可以兼容下载视频在手机可移除的存储介质(例如 SD 卡)和内部(不可移除)存储中。为了保证逻辑统一性,没有设置“下载文件保存目录setDownloadDir(File)”不会单独使用“辅助存储目录列表setSubDirList(subDirList)”进行相关活动。

注意: 如果想要保存下载视频至SD卡,可能会出现SD卡接触不良,SD卡坏了,SD卡的状态错误等导致的问题。我们在开发中也遇到了SD卡没有权限写入的问题,但是我们确定APP是有赋予 android.permission.WRITE_EXTERNAL_STORAGE 权限的。有些是系统问题,有些是SD卡本身的问题,这些问题需要通过重新拔插SD卡或者更换SD卡来解决。开发者若设置保存至SD卡需了解这些情况。

1.2 设置最大并发下载数

设置最大并发下载数,决定多少个视频能同时下载。默认是1。设置为负数和0是没有限制。

//在 Appication 中设置
PolyvDownloaderManager.setDownloadQueueCount(1);

2 视频下载

2.1 下载任务

每一个视频下载任务,都会对应一个 PolyvDownloader。而 PolyvDownloaderManager会根据 VID 生成 key 把 PolyvDownloader 实例存到 Map<key,PolyvDownloader> 里面,如果没有该实例就创建一个。所以PolyvDownloaderManager 管理着所有的下载任务,开发者不应该直接去创建 PolyvDownloader,而是应当通过 PolyvDownloader.getPolyvDownloader(...) 方法来获取该实例,保证所有的下载任务统一管理。

  1. 获取downloader

PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType);
  1. 设置视频下载的token回调

downloader.setDownloaderTokenRequestListener(new IPLVDownloaderTokenRequestListener() {
    @Override
    public String onRequestToken(@NotNull String videoId, int bitRate) {
        // 返回视频下载的token
        return token;
    }
});

通过设置视频下载的 token 回调,您可以接入 IP 白名单控制,最大限度地保证视频的安全,可以参考版权保护最佳实践以获得更多关于视频安全性的信息。

  1. 开始下载

downloader.start(getApplicationContext);

2.2 参数说明

下载任务可以常见几个重要的参数vid, bitrate, filetype等。

  • vid 是在后台上传视频成功后,由后台自动生成在视频列表中的。VID是视频的唯一识别标志。

  • bitrate 码率。也可以认为是清晰度。我们封装了枚举类型的码率以及相关的一些方法在PolyvBitRate.java中,可以直接使用。

  • filetype 文件类型。PolyvDownloader 中定义了几个下载的文件类型。FILE_VIDEO, FILE_AUDIO, FILE_PPT。可以按情况下载对应的文件。

2.3 下载控制

对于下载任务的批量操作,可以使用 PolyvDownloaderManager

PolyvDownloaderManager.startAll(context);//开启所有下载任务
PolyvDownloaderManager.stopAll();        //停止全部下载任务
PolyvDownloaderManager.releaseDownload();//释放所有当前的下载任务,清空下载队列
PolyvDownloaderManager.isWaitingDownload(vid,bitRate);//是否等待下载中

对于详细的下载任务,可以获取 PolyvDownloader实例操作。

//获取downloader
PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType);

downloader.start(context);//开始下载
downloader.stop();//停止下载
downloader.delete();//删除音频/视频文件(根据FileType决定),删除之前会做stop操作

更多的操作可查看API 文档

3 下载回调

对于下载任务PolyvDownloader ,我们开放了多种下载回调。

  • 下载速度回调

/**
 * 下载速度监听回调,主线程中回调
 */
public interface IPolyvDownloaderSpeedListener {
     /**
     * @param speed byte(字节)
     */
    @MainThread
    void onSpeed(int speed);
}
  • 下载进度回调

/**
 * 下载监听回调,主线程中回调
 */
public interface IPolyvDownloaderProgressListener2 {
    /**
     * 下载进度
     * @param current - 已下载视频文件大小
     * @param total - 视频文件大小
     */
    @MainThread
    void onDownload(long current ,long total);

    /**
     * 下载完成成功
     * @param bitrate 下载视频的码率
     */
    @MainThread
    void onDownloadSuccess(int bitrate);

    /**
     * 下载失败
     * @param errorReason 失败原因
     */
    @MainThread
    void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason);
}
  • 下载开始回调

/**
 * 下载开始监听回调。
 * @author Lion 2017-8-1
 */
public interface IPolyvDownloaderStartListener {
    /**
     * 开始回调,{@link PolyvDownloader#start()}或者{@link PolyvDownloader#start(Context)}中开始了下载,就回调。若没有回调此方法,就表示在下载队列中,处于等待状态。
     */
    @MainThread
    void onStart();
}

更多下载回调可查看API 文档com.easefun.polyvsdk.download.listener包。

Last updated