我正在从M3U8清单下载mp4剪辑,该清单可以包含700个剪辑。一切正常,可以下载它们,但是最好检查单个下载是否完成?下载所有剪辑后,我将它们合并为一个,但是我需要知道何时首先下载所有剪辑。
这是我用来下载视频片段的代码片段。
func download(video: String){
DispatchQueue.global(qos: .background).async {
if let url = URL(string: "http://SERVER/storage/sessions/SESSIONID/mp4_segments/\(video)"),
let urlData = NSData(contentsOf: url) {
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
let fileName = video
let filePath = "\(documentsPath)/SegmentVideos/\(fileName)"
urlData.write(toFile: filePath, atomically: true)
}
}
}
这是读取M3U8文件并将其拆分的代码段,以便我可以获取视频剪辑的名称。
func checkM3U8forClips(){
guard let url = url else {return}
do {
let contents = try String(contentsOf: url)
let splitContent = contents.components(separatedBy: "\n")
for split in splitContent {
if split.hasSuffix("mp4") {
download(video: split)
}
}
} catch {
print("error with mp4 segments: \(error.localizedDescription)")
}
}
您陷入困境的一个原因是此代码是错误的:
if let url = URL(string: "http://SERVER/storage/sessions/SESSIONID/mp4_segments/\(video)"),
let urlData = NSData(contentsOf: url) {
您必须从不使用NSData(contentsOf:)
进行联网。如果要联网,则联网:使用URLSession和适当的数据任务或下载任务。现在您将获得所需的回调。如果您以完整格式进行操作,则会获得一整套委托回调,这些回调准确告诉您下载何时成功完成(或失败)。