iOS 分享一個邊播邊快取的庫(支援VOD和HLS)
阿新 • • 發佈:2020-06-24
SJMediaCacheServer
SJMediaCacheServer 是一個 iOS 端的 HTTP 媒體資料快取框架. 播放器向本地 HTTP 代理伺服器傳送播放請求後,會查詢本地快取,如不存在快取,則進行下載並返回給播放器.
主要特點
- 支援快取 VOD 和 HLS 等型別的資源.
- 支援預載入 (預快取).
安裝
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日誌
開啟後,控制檯將輸出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
- GitHub : changsanjiang
- Email : [email protected]
- QQGroup: 930508201
Reference
-
KTVHTTPCache - KTVHTTPCache is a powerful media cache framework. It can cache HTTP request,and very suitable for media resources.