以下探讨只关于 ios 端抖音(虽然字数不多,但是绝对重点!!!)
最近项目中总感觉自己的滑动播放没有抖音那么流畅,在不断摸索不断碰壁中找到中间方案.
ps 抖音的方案:经过抖音缓存文件分析,猜测其解决方案为:
m3u8 文件解析包含所有 ts 段信息
1.(下载解析 m3u8 文件拿到首段地址)预下载 10 条视频的首 ts 段(抖音沙盒缓存文件Library/Caches/TTPlayerCache) 2.通过本地服务器播放下载的首ts段来解决流畅度问题
注: 其他的段则在播放过程中缓存下来拼接到首段(查看抖音的缓存发现 只有一个 ts(将.mdl改为.ts 即可播放 这里是抖音做的混淆) 段 ),具体怎么拼接的算法还有网络缓存细节这里不再关注,因为本文使用的方案不是该方案.
本文方案: 为了避免做缓存策略以及如何拼接等一系列麻烦事宜,我所采取的方案是当请求播放其他段时进行重定向到服务器.
方案说起来简单如何做? 具体以下步骤:
搭建本地服务器---->解析 m3u8获取首段地址---->下载首段保存本地 ---->播放器播放地址为本地服务器 m3u8 地址(目的是为了播放第一个片段和拦截所有播放请求)---->当请求 ts 段时判断是否是第一片段 是->进行本地的播放 否->进行重定向到服务器的播放地址.
核心代码:
///全局变量
let webServer = GCDWebServer()
webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self, processBlock: {request in
var url = request.url
let localpath = "\(NSHomeDirectory())/Documents/M3U8File/\(url.absoluteString.replacingOccurrences(of: "http://localhost:8080/", with: ""))"
if request.url.absoluteString.contains(".m3u8") && FileManager.default.fileExists(atPath:localpath) {
do {
//已经下载的 m3u8 文件
let string = try String(contentsOfFile: localpath)
return GCDWebServerDataResponse.init(text: string)
} catch {}
} else if (request.url.absoluteString.contains(".ts")) {
if request.url.absoluteString.contains("-000.ts") && FileManager.default.fileExists(atPath:localpath) {
do {
//已经下载 的首段 ts文件
let string = try Data.init(contentsOf: URL(fileURLWithPath: localpath))
return GCDWebServerDataResponse.init(data: string, contentType: "ts")
} catch {}
} else {
//其他 的 ts重定向到服务器
let splitarrys = url.absoluteString.split(separator: "/")
url = URL(string: "(M3u8CacheStateManger.realTsHost(key: splitarrys[2] as NSString))(url.absoluteString.split(separator: "/").last ?? "")")!
debugPrint("重定向 出发(url.absoluteString)")
return GCDWebServerDataResponse.init(redirect: url, permanent: false)
}
}
let urlsplit = url.absoluteString.split(separator: "/")
let realurl = M3u8CacheStateManger.realTsHost(key: urlsplit[2] as NSString)
return GCDWebServerDataResponse.init(redirect: URL(string: "(realurl)(String(urlsplit.last!))")!, permanent: false)
})
webServer.start(withPort: 8080, bonjourName: "GCD Web Server")
需要用到的工具GCDWebServer(搭建本地服务器 重定向(方案核心!!!))
Demo: https://github.com/1241545546/M3u8DownLoadManger-Swift 记得给个星哦!!!!
支持 pod
目前不支持 oc 后续跟进!
使用方法在 Demo 文件夹
如有疑问 QQ 1241545546
如有转载请注明出处谢谢合作! 喜欢就给个赞吧!
网友评论