1

我有一个 iOS 应用程序,可以直接从相机处理来自 captureOutput 的视频帧。作为处理的一部分,我在另一个源文件中调用了几个 C 函数。我将 UIImages 转换为原始数据并快速传递这些数据——所有处理都在与视频输出相关的队列上完成。

在某种程度上,这似乎工作正常。当我传递的数据变得太大并且在 C 函数的初始化阶段弹出看似随机的 EXC_BAD_ACCESS 错误时,我似乎遇到了一个限制。通过初始化我的意思是,声明小的静态数组并将它们设置为零等。

我想知道我是否在传递大量数据时达到了某种堆栈限制,因此尝试使用其他链接器标志和-Wl,-stack_size 来增加堆栈大小,但这似乎没有什么不同。

以这种方式从非 UI 线程调用 C 函数还有什么我应该注意的吗?

抱歉有点笼统,但我无法发布代码的细节,我正在寻找针对这种情况的一般建议和技巧。

一些进一步的信息——我们在 Objective-C 的视频处理端释放内存和使用自动释放池时遇到了问题(因为我们在不同的线程上推荐)——也许我们在 C 代码中遇到了同样的困难。有没有办法增加在 C 中执行释放/释放的频率,或者我只是在追逐我的尾巴?

4

2 回答 2

0

在围绕一些关键代码区域添加几个 @autoreleasepool 块之后,我们确定了我们遇到的内存问题的主要原因。

似乎在 captureOutput 回调函数中包含以下块就可以了。

@autoreleaspool
  {
  imageColour = [self imageFromSampleBuffer:sampleBuffer];
  }

注意:imageFromSampleBuffer 取自这个问题 ios capture image using AVFramework

于 2013-08-01T09:17:16.227 回答
0

所以,你的问题的根源是内存使用。即使您没有泄漏任何内存并且非常小心,在 iOS 上编写视频处理应用程序也非常棘手,因为在操作系统因内存使用而终止您的应用程序之前,您实际上只能在应用程序中分配这么多内存。如果你想阅读我关于这个主题的博客文章,你可以在video_and_memory_usage_on_ios找到它. 一些要记住的简单规则是,您基本上可以在短时间内分配和使用 10 兆内存,但除此之外,您可能会破坏操作系统,并且您的应用程序可能会被终止。对于文件中的虚拟映射内存,任何时候所有映射内存的上限为大约 700 兆。这不是堆栈问题,我说的是堆内存。您不应该将视频内存放在堆栈上,这太疯狂了。注意只传递指向内存的指针,切勿将内存从一个缓冲区复制到另一个缓冲区,只需将 refs 传递到缓冲区中的内存即可。CoreGraphics 和 CoreVideo 中的 iOS API 支持这种“分配缓冲区并传递指针”类型的方法。

于 2013-07-16T21:55:44.497 回答