ios 使用更改的URL恢复HLS下载(AVAssetDownloadURLSession)

zzoitvuj  于 2023-03-20  发布在  iOS
关注(0)|答案(1)|浏览(140)

需要强大的 *AVKit用户 * 和 *AVFoundation用户 * 的帮助
我正在努力恢复以前部分下载的HLS流。
网址,我有,改变每24小时。如果用户试图恢复下载-它只是重新开始,并忽略较早的下载进度。
我使用来自apple的代码-Using AVFoundation to Play and Persist HTTP Live Streams
现在它是这样工作的:
1.通过assetDownloadURLSession.aggregateAssetDownloadTask流开始下载
1.用户按下暂停。在这种情况下,我将所有进度保存到本地文件,并使用bookmarkData()来保持本地URL:

let bookmark = try tempDownloadUrl?.bookmarkData()
userDefaults.set(bookmark, forKey: assetId)

1.链接失效,用户从AVAssetDownloadDelegate点击恢复-〉didFinishDownloadingTo,立即触发403 -禁止。
1.我尝试使用assetDownloadURLSession.aggregateAssetDownloadTask创建新的AVAggregateAssetDownloadTask并插入文件的本地URL(.movpkg)来重新启动下载任务。如果链接没有更改,则一切按预期工作。
1."我们在这里"
一些想法:

  • 也许我们可以设法复制下载量,如果m3u8块到新的下载任务
  • 也许我们可以更改之前下载的**.movpkg**文件中的某种 serverURL

或者一些新的东西。(我可以分享一个链接,死亡后2分钟的测试目的)
先谢了。

unftdfkk

unftdfkk1#

好吧。我知道怎么处理这么复杂的任务了。
主要的事情是更新我们的本地.movpkg文件中的死NetworkURL到一个新的闪亮的NetworkURL。
首先,我们需要读取本地文件.movpkg文件的内容。

let subDirectories = try FileManager.default.contentsOfDirectory(
    at: ourLocalUrl, 
    includingPropertiesForKeys: nil, 
    options: .skipsSubdirectoryDescendants
 )

很好,现在我们需要遍历本地目录并找到**.xml.frag**文件,它们保存着我们的旧URL。
[* 很抱歉代码有些混乱,它不是可用于生产的代码,它只是指出了解决问题的正确方向。请根据您自己的目的重构它 *]:

for url in subDirectories {
   var isDirectory: ObjCBool = false 
   if FileManager.default.fileExists(atPath: url.path, isDirectory: &isDirectory) {
     if isDirectory.boolValue {
       debugPrint("[Searched FOLDER]\(url)")
       let newDirectories = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: .skipsSubdirectoryDescendants)
       var isNewDirectory: ObjCBool = false
       for newUrl in newDirectories {
         if FileManager.default.fileExists(atPath: newUrl.path, isDirectory: &isNewDirectory) {
            if isNewDirectory.boolValue {
               debugPrint("[Searched FOLDER DIRECTORY]\(newUrl)")
            } else {
               if var fileContent = try? String.init(contentsOf: URL.init(fileURLWithPath: newUrl.path)) {
                  fileContent = fileContent.replacingOccurrences(of: oldUrlString, with: newUrlString)
                  try? fileContent!.write(toFile: url.path, atomically: true, encoding: .utf8)
               }
            }
     } else {
       debugPrint("[Searched FILE]\(url)")
       var fileContent = try? String.init(contentsOf: URL.init(fileURLWithPath: url.path))
       fileContent! = fileContent!.replacingOccurrences(of: oldUrlString, with: newUrlString)
       try? fileContent!.write(toFile: url.path, atomically: true, encoding: .utf8)
     }
   }
}

因此,在上面的代码中,我们搜索我们的oldUrlString并将其替换为newUrlString。您也可以从xml文件或CoreData(如果您将oldUrl存储在某个地方)获得oldUrlString。
在更新之前,从oldUrlString和newUrlString中删除最后一个路径组件。因此,链接类似于:

aaaa/xxxx123.smil

而不是

xxxx123.smil/chunklist_b1728000.m3u8

这是因为块是这样放置的,如果你不从路径中删除chunklist_b1728000.m3u8,替换将不起作用:

xxxx123.smil/chunk01.ts
xxxx123.smil/chunk02.ts
xxxx123.smil/chunk04.ts
...

就这样,URL替换后,简历下载成功。

相关问题