【发布时间】:2021-06-30 12:55:30
【问题描述】:
正如标题所说,我在使用 AVAssetWriter 和内存时遇到了一些问题。
关于我的环境/要求的一些说明:
- 我没有使用 ARC,但如果有一种方法可以简单地使用它并使其全部正常工作,我完全赞成。不过,我的尝试并没有产生任何影响。我将在其中使用它的环境需要尽快最小化/释放内存。
- Objective-C 是一项要求
- 内存使用量必须尽可能低,在我的设备 (iPhone X) 上测试时,它现在占用的 300mb不稳定。
代码
这是在https://gist.github.com/jontelang/8f01b895321d761cbb8cda9d7a5be3bd下面截图时使用的代码
记忆中的问题/项目
在整个处理过程中似乎占用大量内存的大部分东西似乎是在开始时分配的。
因此,在我看来,问题出在我的代码上。我个人可以控制的代码 似乎 不是问题,即加载图像、创建缓冲区、释放它似乎不是内存有问题的地方。例如,如果我在 Instruments 中的大部分时间在上面进行标记,则内存是稳定的,并且没有任何内存被保留。
持久 5mb 的唯一原因是它在标记期结束后被释放。
现在呢?
我实际上开始写这个问题的重点是我的代码是否正确地发布了东西,但现在看来这很好。那么我现在有什么选择呢?
- 我可以在当前代码中配置什么来减少内存需求吗?
- 我的编写器/输入设置是否有问题?
- 我是否需要使用完全不同的视频制作方式才能完成这项工作?
使用 CVPixelBufferPool 的注意事项
在 CVPixelBufferCreate Apple 的文档中指出:
如果您需要创建和释放多个像素缓冲区,则应改为使用像素缓冲区池(请参阅 CVPixelBufferPool)以有效地重用像素缓冲区内存。
我也尝试过,但我发现内存使用没有变化。更改池的属性似乎也没有任何效果,因此我实际上并没有 100% 正确使用它的可能性很小,尽管与在线代码进行比较 似乎至少我是。并且输出文件有效。
代码在这里https://gist.github.com/jontelang/41a702d831afd9f9ceeb0f9f5365de03
这是一个稍微不同的版本,我以稍微不同的方式设置池https://gist.github.com/jontelang/c0351337bd496a6c7e0c94293adf881f。
更新 1
所以我对跟踪进行了更深入的研究,以找出大部分分配的时间/地点。这是一个带注释的图像:
要点是:
- 空间未与 AVAssetWriter“一起”分配
- 在处理开始后 500ms 内分配 500mb,直到结束为止
- 好像是在 AVAssetWriter 内部完成的
我在这里上传了 .trace 文件:https://www.dropbox.com/sh/f3tf0gw8gamu924/AAACrAbleYzbyeoCbC9FQLR6a?dl=0
【问题讨论】:
标签: ios objective-c avassetwriter cvpixelbuffer