阅读 4087

iOS 分享一个边播边缓存的库(支持FILE和HLS)

SJMediaCacheServer

SJMediaCacheServer 是一个 iOS 端的 HTTP 媒体数据缓存框架. 播放器向本地 HTTP 代理服务器发送播放请求后, 会查询本地缓存, 如不存在缓存, 则进行下载并返回给播放器.

主要特点

  • 支持缓存 FILE 和 HLS 等类型的资源.
  • 支持预加载 (预缓存).

安装


pod 'SJUIKit/SQLite3', :podspec => 'https://gitee.com/changsanjiang/SJUIKit/raw/master/SJUIKit-YYModel.podspec'
pod 'SJMediaCacheServer'

复制代码

快速开始

  1. 导入头文件

#import <SJMediaCacheServer/SJMediaCacheServer.h>

复制代码
  1. 获取播放地址

调用以下方法将原始地址进行转换. 当存在缓存时, 将返回本地文件的播放地址.

    // [NSURL URLWithString:@"https://.../video.m3u8"];
    // [NSURL URLWithString:@"https://.../audio.mp3"];
    // 原始地址
    NSURL *URL = [NSURL URLWithString:@"https://.../video.mp4"];
    // 实际播放地址
    NSURL *playbackURL = [SJMediaCacheServer.shared playbackURLWithURL:URL];
复制代码
  1. 进行播放

这里使用 AVPlayer 进行播放, 正常来说使用第三方的播放器 SDK 也是可以的.

    AVPlayer *player = [AVPlayer playerWithURL:playbackURL];
    [player player];
复制代码

缓存管理

  1. 限制缓存的资源个数, 当超出限制时, 则触发删除操作
    SJMediaCacheServer.shared.cacheCountLimit = 20;
复制代码
  1. 限制缓存保存的时长, 当过期时, 则触发删除操作
    // 单位是秒, 这里设置为保留24小时
    SJMediaCacheServer.shared.maxDiskAgeForCache = 24 * 60 * 60;
复制代码
  1. 限制占用的磁盘空间, 当超出限制时, 则触发删除操作
    // 单位是字节, 这里设置为缓存最大占用 1G
    SJMediaCacheServer.shared.maxDiskSizeForCache = 1 * 1024 * 1024 * 1024;
复制代码
  1. 限制保留磁盘的空间, 当磁盘剩余空间不足时, 则触发删除操作
    // 单位是字节, 这里设置为保留剩余空间 1G
    SJMediaCacheServer.shared.reservedFreeDiskSpace = 1 * 1024 * 1024 * 1024;
复制代码
  1. 删除全部缓存
    [SJMediaCacheServer.shared removeAllCaches];
复制代码

控制台开启log日志

开启后, 控制台将输出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

同一个资源可能对应不同的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;
    };
复制代码

Feedback

Reference

文章分类
iOS
文章标签