SJMediaCacheServer 是一个 iOS 端的 HTTP 媒体数据缓存框架. 播放器向本地 HTTP 代理服务器发送播放请求后, 会查询本地缓存, 如不存在缓存, 则进行下载并返回给播放器.
pod 'SJUIKit/SQLite3', :podspec => 'https://gitee.com/changsanjiang/SJUIKit/raw/master/SJUIKit-YYModel.podspec' pod 'SJMediaCacheServer' 复制代码
#import <SJMediaCacheServer/SJMediaCacheServer.h> 复制代码
调用以下方法将原始地址进行转换. 当存在缓存时, 将返回本地文件的播放地址.
// [NSURL URLWithString:@"https://.../video.m3u8"]; // [NSURL URLWithString:@"https://.../audio.mp3"]; // 原始地址 NSURL *URL = [NSURL URLWithString:@"https://.../video.mp4"]; // 实际播放地址 NSURL *playbackURL = [SJMediaCacheServer.shared playbackURLWithURL:URL]; 复制代码
这里使用 AVPlayer 进行播放, 正常来说使用第三方的播放器 SDK 也是可以的.
AVPlayer *player = [AVPlayer playerWithURL:playbackURL]; [player player]; 复制代码
SJMediaCacheServer.shared.cacheCountLimit = 20; 复制代码
// 单位是秒, 这里设置为保留24小时 SJMediaCacheServer.shared.maxDiskAgeForCache = 24 * 60 * 60; 复制代码
// 单位是字节, 这里设置为缓存最大占用 1G SJMediaCacheServer.shared.maxDiskSizeForCache = 1 * 1024 * 1024 * 1024; 复制代码
// 单位是字节, 这里设置为保留剩余空间 1G SJMediaCacheServer.shared.reservedFreeDiskSpace = 1 * 1024 * 1024 * 1024; 复制代码
[SJMediaCacheServer.shared removeAllCaches]; 复制代码
开启后, 控制台将输出log, 这个仅在 Debug 模式下有效, Release 模式不会产生任何 log.
SJMediaCacheServer.shared.enabledConsoleLog = YES; 复制代码
提前加载某个资源.
// 获取task, 在不需要时取消任务. id<MCSPrefetchTask> task = [SJMediaCacheServer.shared prefetchWithURL:URL preloadSize:20 * 1024 * 1024 progress:^(float progress) { NSLog(@"%lf", progress); } completed:^(NSError * _Nullable error) { NSLog(@"%@", error); }]; // 不需要时取消该任务 [task cancel]; 复制代码
如下方式, 为每个下载请求添加自定义的请求头:
SJMediaCacheServer.shared.requestHandler = ^NSMutableURLRequest * _Nullable(NSMutableURLRequest * _Nonnull request) { [request addValue:@"value1" forHTTPHeaderField:@"header filed1"]; [request addValue:@"value2" forHTTPHeaderField:@"header filed2"]; return request; }; 复制代码
同一个资源可能对应不同的URL, 可以设置以下block, 返回该资源的标识, 相同的标识将使用相同的缓存:
SJMediaCacheServer.shared.resolveResourceIdentifier = ^NSString * _Nonnull(NSURL * _Nonnull URL) { NSString *identifier = URL.absoluteString; return identifier; }; 复制代码
如有特殊需求, 可对读取和写入的缓存数据进行一些操作
SJMediaCacheServer.shared.writeDataEncoder = ^NSData * _Nonnull(NSURLRequest * _Nonnull request, NSUInteger offset, NSData * _Nonnull data) { // data 将会被写入到缓存 return data; }; SJMediaCacheServer.shared.readDataDecoder = ^NSData * _Nonnull(NSURLRequest * _Nonnull request, NSUInteger offset, NSData * _Nonnull data) { // 该 data 来源于本地缓存 return data; }; 复制代码
KTVHTTPCache - KTVHTTPCache is a powerful media cache framework. It can cache HTTP request, and very suitable for media resources.
tools.ietf.org/html/rfc723…