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

SJMediaCacheServer

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

主要特色

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

安装

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

快速开始

  1. 导入头文件
#import <SJMediaCacheServer/SJMediaCacheServer.h>
复制代码
  1. 获取播放地址

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

// [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 也是能够的.github

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;
复制代码

预加载 (预缓存)

提早加载某个资源.ruby

// 获取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;
    };
复制代码

  • 对缓存的数据作加解密操做

若有特殊需求, 可对读取和写入的缓存数据进行一些操做ide

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

  • GitHub : changsanjiang
  • Email : changsanjiang@gmail.com
  • QQGroup: 930508201

Reference

相关文章
相关标签/搜索