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

相關文章
相關標籤/搜索