【问题标题】:IOS Memory Management - writing video to temp fileIOS 内存管理 - 将视频写入临时文件
【发布时间】:2023-03-10 16:51:01
【问题描述】:

我正在创建一个应用程序,它可以以 snapchat 故事的方式播放多个视频和照片。我获取这些视频数据中的每一个并将其写入临时文件以便与AVPlayer 一起玩。

NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), [NSString stringWithFormat:@"output%i.mov", i]];
[data writeToFile:outputPath atomically:YES];

viewWillDissapear 我删除了所有这些文件:

NSArray* tmpDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:NSTemporaryDirectory() error:NULL];
for (NSString *file in tmpDirectory) {
    [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), file] error:NULL];
}

但是当我查看我的应用程序使用了多少内存时,在设置中,它大约是 300 mb。有没有办法查看实际占用所有这些内存的内容?我认为这很高,因为除了 currentUser 数据(名称、profileImage)之外,我没有缓存任何内容。 我应该做其他事情来清理临时文件吗?

【问题讨论】:

  • “有没有办法查看到底是什么占用了所有这些内存”仪器。

标签: ios memory-management avplayer writetofile


【解决方案1】:

但是这一行是绝对错误的:

[data writeToFile:outputPath atomically:YES];

这意味着在某个时刻——这一刻——你将整个视频保存在内存中(如data)。这是完全不正确的;它不应该发生。您应该下载到磁盘上的文件,如有必要,将该文件写入另一个文件;你不应该尝试一次将整个视频加载到内存中。

【讨论】:

  • 如果我不加载数据然后创建NSURL,我应该如何使用AVPlayer 播放视频? “下载到磁盘上的文件”,- 只需在“iOS 中的 dev 上阅读此内容,因为不鼓励直接下载到文件系统”,您指的是使用 NSURLSession@matt
  • "如果我不加载数据然后创建 NSURL,我想如何使用 AVPlayer 播放视频" 你有一个 NSURL,这正是你会 需要加载数据!您提供文件 URL 或远程 URL。您从不自己“加载数据”。 AVPlayer 不需要所有数据在任何时候都在内存中;这就是视频播放的美妙之处。
  • 然后下载到一个文件,并按照我已经说过的给出文件URL。
  • 你能提供一些如何做到这一点的代码吗?抱歉,这是我第一次处理视频。我正在使用解析将 vids 保存为 PFFiles。你是说只是将播放器项目设置为 pffile.url。如果是这样,那么是的,就像我说的那样,我已经尝试过了,视频非常滞后
  • 怎么办?问题是关于你的内存管理。我相信我已经回答过了。永远不要将视频数据提取到内存中。
【解决方案2】:

正如@peter 提到的,您可以使用流式传输Video streaming

否则,如果您真的想下载视频文件并将其存储到磁盘空间并希望稍后使用它,那么您应该按照苹果推荐的方式,即 NSFileHandle 类来优化您的应用程序堆内存,同时下载更大的文件。

NSFileHandle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2010-11-10
    • 2023-03-27
    • 2012-10-27
    相关资源
    最近更新 更多