2017-08-02 61 views
0

在我的应用程序中,允许用户录制视频。在他们录制视频后,他们被追加到一个数组中,并用缩略图放在一个表视图上,以便他们可以选择视频并观看它。但是,如果我录制视频并进入桌面视图,则在退出应用程序后视频消失。保存和检索视频及其缩略图到应用程序的目录

什么是保存视频的最佳方式,而不必将其保存到用户相机胶卷,并在以后再次打开应用时检索它。我阅读了核心数据,但听说它不被推荐。有没有更好的方法来做到这一点?

有人可以向我解释这一点,我很难处理目录。我几乎没有任何经验。

我录制视频到这里这个文件位置:

self.movieFileOutput.startRecording(toOutputFileURL: URL(fileURLWithPath:self.videoFileLocation()), recordingDelegate: self) 


func videoFileLocation() -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .long 
    dateFormatter.timeStyle = .long 
    let date = dateFormatter.string(from: Date()) 
    return NSTemporaryDirectory().appending("videoFile\(date)") 
} 

一旦视频完成录制,我将其追加到该数组。

var videosArray: [URL] = [URL]() 

然后我得到的每个视频的使用这种方法的缩略图:

func getThumbnail(_ outputFileURL:URL) -> UIImage { 

    let clip = AVURLAsset(url: outputFileURL) 
    let imgGenerator = AVAssetImageGenerator(asset: clip) 
    let cgImage = try! imgGenerator.copyCGImage(
     at: CMTimeMake(0, 1), actualTime: nil) 
    let uiImage = UIImage(cgImage: cgImage) 
    return uiImage 

} 

我然后将其附加到这个阵列的位置:

var thumbnails = [UIImage]() 

怎样才能让这些视频和它们的缩略图在用户退出应用程序时不会消失。我真的需要帮助,因为我非常沮丧。

的最好方式是将它们保存到:

  • 用户默认
  • CoreData
  • 从目录
  • 或其他任何建议直接检索它们你可能有。

你能告诉我最好的方法,并告诉我如何做到这一点。我需要一个详细的答案。谢谢。

回答

1

我会建议在核心数据以及文件系统中的所有视频和图像数据中存储所有用于记录的元数据。在核心数据存储中,您可能希望在tableview中显示的任何元数据 - 长度,标题,创建者,创建日期,修改日期,标签等 - 即使它可以通过加载文件生成 - 更快地从数据库加载它。将视频和缩略图存储在文档目录(而不是临时目录)中,并将核心数据中的文件的RELATIVE路径存储。请确保使用相对路径而不是绝对路径,因为当通过iTunes升级或恢复应用程序时,应用程序目录可能会更改。

看来你是基于视频的创建日期命名文件。我会建议反对这个。日期格式化程序很复杂,可以根据语言环境或时区或其他系统设置进行更改。我会建议您根据存储在核心数据中的UUID命名该文件。

总结:

  1. 存储你的文件目录中的文件 - 而不是临时目录
  2. 存储所有文件的元数据中的核心数据。
  3. 保存相对路径的视频文件和缩略图文件中的核心数据
  4. 名称文件与UUID - 不是一个日期字符串
+0

我很欣赏这一点。我不明白你的意思是把它们存储为相对而非绝对的。你能过去吗? –

+0

它似乎即使我保存在coredata的url,该文件不存在了,当我重新启动应用程序。这就是你为什么建议一个相对文件的URL。我不确定如何使用它。 –

+0

当您重新启动应用程序时,保存在NSDocumentDirectory中的文件应该在那里。 –