You need to enable JavaScript to run this app.
导航
下载视频
最近更新时间:2025.12.02 10:32:31首次发布时间:2025.12.02 10:32:31
复制全文
我的收藏
有用
有用
无用
无用

播放器 SDK 支持下载功能。用户可在有网络的条件下将视频下载至本地,随后在无网络的环境下观看。SDK 支持下载 DirectUrl 视频源和 Vid 视频源,并提供开始、暂停、恢复、删除等控制下载任务的方法。

初始化下载功能

说明

需要特别注意的是,初始化代码的时序对下载功能是否能正常工作有直接影响:

  • 如果您需要下载 HLS 视频,需要在初始化 SDK 前额外开启 HLS 下载功能。此方法必须在 startWithConfiguration(<sdkConfig>) 方法之前调用。
  • 设置下载文件存储路径,需要在 startWithConfiguration(<sdkConfig>) 方法之前调用。
  • 其他下载配置则需要在 startWithConfiguration(<sdkConfig>) 方法之后调用。

示例代码如下:

// 开启 HLS 下载功能。可选,如业务中无需下载 HLS 视频,可跳过。
TTVideoEngineDownloadTaskManager.enableHlsProxy(true);

// 必填,设置下载文件存储路径    
String platformDir;
if (Platform.isIOS) {
    platformDir = (await getApplicationDocumentsDirectory()).path;
} else {
    platformDir = (await getDownloadsDirectory())!.path;
}
platformDir = "$platformDir/xxxx";
TTVideoEngineDownloadTaskManager.setDownloadDirectory(platformDir);

// 初始化 SDK    
FlutterTTSDKManager.startWithConfiguration(sdkConfig);

// 选填,设置最大并发下载数,默认值为 1        
TTVideoEngineDownloadTaskManager.setMaxDownloadOperationCount(3); 

// 选填,设置空闲磁盘空间大小的限制,默认值 1G
TTVideoEngineDownloadTaskManager.setLimitFreeDiskSize(1024 * 1024 * 1024); 

// 默认支持缓存最多 50 个视频。如业务超出此限制,需进行以下设置
TTVideoEngineDownloadTaskManager.setLimitFreeDiskCount(500);

// 加载所有预加载任务
TTVideoEngineDownloadTaskManager.loadAllTask();

创建下载任务

SDK 支持播放 DirectUrl 视频源和 Vid 视频源。与之对应,SDK 也提供了不同数据源的下载能力。

创建 DirectUrl 视频源下载任务

// 传入 urls、cacheKey、videoId,其中 urls 和 cacheKey 必填,cacheKey 需和视频源一一对应
TTVideoEngineDownloadURLTask task = TTVideoEngineDownloadURLTask(urls: <urls>, cacheKey: <cachekey>, videoId: <videoId>);
task.resume();

创建 Vid 视频源下载任务

// 传入 videoId、playAuthToken 和目标清晰度
// codecType:指定需下载的视频编码格式,默认下载 H.264
TTVideoEngineDownloadVidTask task = TTVideoEngineDownloadVidTask(
                            videoId: <videoId>,
                            playAuthToken: <playAuthToken>,
                            resolution: <resolution>,
                            codecType: <codecType>);
task.resume();

控制下载任务

通过以下方法控制单个下载任务:

// 开始/恢复单个下载任务。
// 支持断点续传。
task.resume();

// 暂停单个下载任务,支持断点续传。
task.suspend();

// 删除单个下载任务。
// 下载任务被删除后,任务会停止,同时 TTVideoEngineDownloadTaskManager 将不再管理这个任务。
task.invalidateAndCancel();

通过以下方法控制所有下载任务:

// 开始/恢复所有下载任务
TTVideoEngineDownloadTaskManager.resumeAllTask();

// 暂停所有下载任务
TTVideoEngineDownloadTaskManager.suspendAllTask();

// 删除所有下载任务
TTVideoEngineDownloadTaskManager.removeAllTask();

设置监听

/**
 * 下载任务完成回调。
 * @param task 当前下载任务。
 * @param error 错误。error 为 null 则为下载任务成功,否则为下载任务失败。
 */
TTVideoEngineDownloadTaskManager.onComplete = (TTVideoEngineDownloadTask task, TTError? error) {
  print('Download-onComplete: $task, $error');
};

/**
 * 下载任务进度更新回调。
 * @param task 当前下载任务。
 *             - downloadTask.countOfBytesReceived 当前下载任务已下载的数据总量(HLS 不适用,见下方注意点)
 *             - downloadTask.countOfBytesExpectedToReceive 当前下载任务需要下载的总数据量(HLS 不适用,见下方注意点)
 *             - progress 当前下载任务进度 0.0~1.0
 */
TTVideoEngineDownloadTaskManager.onProgress = (TTVideoEngineDownloadTask task, double progress) {
  print('Download-onProgress: $task, $progress');
};

/**
 * 下载任务开始/恢复回调。
 * @param downloadTask 当前下载任务。
 * @param  fileOffset 已下载的数据量。
 * @param  expectedTotalBytes 该任务要下载的总数据量。
 */
TTVideoEngineDownloadTaskManager.onResume = (TTVideoEngineDownloadTask task, int fileOffset, int expectedTotalBytes) {
  print('Download-onResume: $task, $fileOffset, $expectedTotalBytes');
};

/**
 * 下载任务状态变更回调。
 * @param task 当前下载任务。
 * @param state 当前下载任务状态:
 *              - init(0):初始化。
 *              - waiting(1): 等待中。
 *              - running(2): 运行中。
 *              - suspended(3): 暂停。
 *              - canceling(4): 正在取消。
 *              - completed(5): 完成。
 */ 
TTVideoEngineDownloadTaskManager.onStateChanged = (TTVideoEngineDownloadTask task, TTVideoEngineDownloadState state) {
  print('Download-onStateChanged: $task, $state');
};

说明

如果下载的媒体类型为 HLS(M3U8),SDK 无法获知整个视频的文件大小, 回调中的 countOfBytesReceivedcountOfBytesExpectedToReceive 数值并不准确。 因此,对于 HLS(M3U8) 您仅可以通过 task.progress 获取下载的进度。

播放视频

SDK 内部已处理下载缓存与播放的协同关系。您需要调用 enablePlayCachedSource 开启离线播放已下载视频,SDK 会优先播放已经下载的视频,即使它们尚未完全下载完成。

播放 DirectUrl 视频源

参考以下示例代码播放 DirectUrl 视频源:

// 设置source前,开启离线播放已下载视频
player.enablePlayCachedSource();

// 注意 cacheKey 与下载时使用的 cacheKey 一致
TTVideoEngineUrlSource source = TTVideoEngineUrlSource.initWithURLS(<urls>, <cacheKey>);
player.setMediaSource(source);

播放 Vid 视频源

参考以下示例代码播放 Vid 视频源:

// 设置 source 前,开启离线播放已下载视频
player.enablePlayCachedSource();

// 注意 resoluton 与下载时使用的 resolution 一致
TTVideoEngineVidSource source =
        TTVideoEngineVidSource.init(vid: <vid>, playAuthToken: <playAuthToken>, resolution: <resolutionType>);
player.setMediaSource(source);