ios - Swift:从 url 保存视频数据时出错
问题描述
我有以下代码用于保存录制的视频:
func saveVideo() -> Void {
guard let url = self.videoUrl else {
Logger.shared.log(.video, .error, "error video url invalid")
return
}
let homeDirectory = URL.init(fileURLWithPath: NSHomeDirectory(), isDirectory: true)
let fileUrl = homeDirectory.appendingPathComponent(self.adId.toString()).appendingPathComponent("video-clip").appendingPathComponent(UUID.init().uuidString, isDirectory: false).appendingPathExtension("mov")
Logger.shared.log(.video, .debug, "saving video to: \(fileUrl)")
self.savedVideoUrl = fileUrl
do {
let data = try Data(contentsOf: url)
try data.write(to: fileUrl, options: .atomicWrite)
} catch {
Logger.shared.log(.video, .error, "error saving video: \(error.localizedDescription)")
}
}
这里self.videoUrl
是url
从相机录制的视频,并从委托方法初始化:func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
问题是当saveVideo()
方法执行时,它给出了一个错误:
[878 ] 13:22:16.045 | video | Main thread | error saving video: The folder “4A601A28-C4EB-405E-8110-6D01965D5920.mov” doesn’t exist.
我不确定这段代码有什么问题。如果文件不存在,那么我们如何必须先创建文件然后将数据写入其中?
解决方案
好的,几天前我有一个类似的任务(即下载视频,无论 url 源(本地或远程)如何,然后将其保存在本地)。
我用你的功能做了一个实验。
请参阅 github 存储库,其中包含工作示例并将修复应用于您的函数 https://github.com/glennposadas/AVFoundation-SaveLocal
您做错的是您为新文件提供 URL 路径的方式。
编辑:我认为您首先需要创建文件夹路径。我的fileUrl
作品是因为路径存在。
这样,它就可以工作(.mp4 或 .mov,无论哪种方式):
let fileUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
.first!
.appendingPathComponent("\(UUID.init().uuidString).mp4")
它有一条路径(如果你要打印它):
/Users/myusername/Library/Developer/CoreSimulator/Devices/812428A5-0893-43BE-B343-B23E9F13D4AA/data/Containers/Data/Application/E278E093-BE29-410B-9C5D-810BD0F968F8/Documents/F227C8B5-5D8D-42B0-8205-3ADAD0DD38F5.mp4
同时,您的文件网址:
let homeDirectory = URL.init(fileURLWithPath: NSHomeDirectory(), isDirectory: true)
let fileUrl = homeDirectory
.appendingPathComponent("someId")
.appendingPathComponent("video-clip")
.appendingPathComponent(UUID.init().uuidString, isDirectory: false)
.appendingPathExtension("mov")
给出路径:
/Users/myusername/Library/Developer/CoreSimulator/Devices/812428A5-0893-43BE-B343-B23E9F13D4AA/data/Containers/Data/Application/570D3CFA-3C44-41A5-A642-C79E5590D16E/someId/video-clip/5B1C9C98-C9EA-40D2-805C-B326466837E6.mov
编辑:要解决每次构建项目时文档中丢失文件的问题,然后查看我在上面提供的存储库中的更改。我添加了从文档文件夹中检索视频文件的修复程序。
所以基本上你应该如何检索文件是你只保存fileName
. 因为每次构建运行都会产生不同的filePath
.
推荐阅读
- javascript - 为什么在执行 GET XmlHttpRequest 时无法读取和提取此 HTTP 标头?
- themes - 有没有办法将 jupyter 样式添加到 google colab 中?
- php - Symfony 5:在扩展的加载方法中加载包时出错
- spring - 客户端断开连接后 Spring RSocket 高 CPU 使用率
- css - 如何将以下子元素左对齐到第一个子元素的右边缘?
- html - 跨度元素忽略 TranslateZ()
- php - 如果 php.ini 中的 memory_limit 设置为 -1 是什么意思?
- php - 如何更改 PHP Laravel 中的日期格式?
- sql - 在 SQL 中组合 3 个表并找到平均年龄
- javascript - [Circular *1] 是什么意思(VS Code)