Swift:从 url 保存视频数据时出错

Posted

技术标签:

【中文标题】Swift:从 url 保存视频数据时出错【英文标题】:Swift: error while saving video data from url 【发布时间】:2020-11-01 10:30:50 【问题描述】:

我有以下代码用于保存录制的视频:

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.

我不确定这段代码有什么问题。如果文件不存在,那我们如何先创建文件,然后再写入数据呢?

【问题讨论】:

您需要一个实际的文件夹路径,例如 var/root/myvids/ 而不是一些 UUID 数字。使用文件管理器应用程序/工具检查视频文件的文件夹名称和路径,然后在代码中测试该路径。 @VC.One 的目的是将视频保存到具有随机 UUID 名称的文件中。这是为了避免覆盖和现有文件。 即便如此,我想说的是确保您的代码可以首先在基本代码级别保存文件。何时或如果成功,那么您可以检查您的代码的此 UUID 版本是否实际上也指向同一个文件夹。错误说_“文件夹不存在”,但正如您所知,.mov 是文件类型而不是文件夹名称,所以不知何故,您的编译器认为...D5920.mov 是文件夹名称(但我认为您希望它作为文件名)。 【参考方案1】:

好的,几天前我有一个类似的任务(即下载视频,无论 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

【讨论】:

我试过了,现在可以保存视频了。但是当应用程序关闭并再次打开并尝试检索数据时,找不到它。我是最后一个路径组件,然后按照相同的模式重新生成完整的路径。

以上是关于Swift:从 url 保存视频数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 搜索从 swift 2 转换为 swift 3 时出错

核心数据错误代码=134030“保存时出错”,没有用户信息

Swift iOS:将视频保存到库

在 swift 4 上单击 UIWebview 上的播放视频时出错

从 iCloud 文件中取消归档对象时出错

尝试从 Swift 2.0 中的 json 解析数据时出错?