1. 程式人生 > Android開發 >iOS 分享一個邊播邊快取的庫(支援VOD和HLS)

iOS 分享一個邊播邊快取的庫(支援VOD和HLS)

SJMediaCacheServer

SJMediaCacheServer 是一個 iOS 端的 HTTP 媒體資料快取框架. 播放器向本地 HTTP 代理伺服器傳送播放請求後,會查詢本地快取,如不存在快取,則進行下載並返回給播放器.

主要特點

  • 支援快取 VOD 和 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,NSData * _Nonnull data) {
          // 該 data 來源於本地快取
          return data;
        };
    複製程式碼

    Feedback

    Reference