美文网首页iOS音视频优化
ios 抖音视频滑动播放流畅度优化方案实现

ios 抖音视频滑动播放流畅度优化方案实现

作者: wusa | 来源:发表于2020-05-29 17:15 被阅读0次

    以下探讨只关于 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
    如有转载请注明出处谢谢合作! 喜欢就给个赞吧!

    相关文章

      网友评论

        本文标题:ios 抖音视频滑动播放流畅度优化方案实现

        本文链接:https://www.haomeiwen.com/subject/aqcfzhtx.html