1

我正在使用 AVCaptureSession 在 iPhone 上的增强现实类型应用程序中预览视频。由于我还在视频预览之上绘制 OpenGL 图形,因此该应用程序非常耗能。我想尽量减少 CPU 的使用以节省电池。

当我使用 Instruments/Energy 使用情况检查应用程序时,我发现 CPU 的很大一部分(约 20%)被“浪费”在了音频处理上。如果我删除我的捕获会话,音频处理不会像预期的那样占用 CPU。

我不明白为什么捕获会话正在进行音频处理,因为我没有添加任何音频设备输入。这是我设置会话的方式:

if(!captureSession) {
  captureSession = [[AVCaptureSession alloc] init];
  AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
  if (videoDevice) {
    NSError *error;
    AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
    if (!error) {
      if ([captureSession canAddInput:videoIn]) {
        [captureSession addInput:videoIn];
      }
    }
  }
}

if(!previewLayer) {
  previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
  [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
}

CGRect layerRect = [[viewBg layer] bounds];
[previewLayer setBounds:layerRect];
[previewLayer setPosition:CGPointMake(CGRectGetMidX(layerRect), CGRectGetMidY(layerRect))];
[[viewBg layer] addSublayer:previewLayer];

[captureSession startRunning];                                              

有没有办法完全禁用音频(输入),或者在预览视频输入时如何摆脱音频处理 CPU 使用率?

4

2 回答 2

2

作为更大的性能优化,我可以建议不要使用覆盖在 AVCaptureVideoPreviewLayer 上的非透明 OpenGL ES 内容吗?相反,您将获得更好的渲染性能,方法是抓取您的相机源,将其作为纹理上传以在您的增强现实内容后面渲染,然后在包含相机纹理的屏幕大小的纹理四边形前面渲染您的内容。

从个人经验来看,渲染不透明的 OpenGL ES 内容会导致严重的减速,因为在这种情况下需要执行合成。获取您的相机帧并将它们显示为 OpenGL ES 场景中的背景将让您将 OpenGL ES 托管视图设置为不透明,这样效率更高。

我有一些示例代码作为对象跟踪示例的一部分,但是可以在我的开源GPUImage框架的 GPUImageVideoCamera 类中找到更高效的相机捕获和上传版本。此外,在我对该框架的代码进行分析时,我没有看到在没有将音频输入配置为会话的一部分的情况下进行音频录制,因此您可以检查我在那里所做的事情。

于 2012-05-30T18:05:00.760 回答
1

我也有同样的问题。我正在使用 AV Foundation 扫描条形码,对音频不感兴趣。然而,大约 20% 浪费在我的 iPhone 5S 的“音频处理”上。

我为此提交了此错误报告。欢迎你欺骗它。

于 2014-03-21T10:41:57.310 回答