我正在使用 AVCaptureSession 在 iPhone 上的增强现实类型应用程序中预览视频。由于我还在视频预览之上绘制 OpenGL 图形,因此该应用程序非常耗能。我想尽量减少 CPU 的使用以节省电池。
当我使用 Instruments/Energy 使用情况检查应用程序时,我发现 CPU 的很大一部分(约 20%)被“浪费”在了音频处理上。如果我删除我的捕获 session ,音频处理不会像预期的那样占用 CPU。
我不明白为什么捕获 session 正在进行音频处理,因为我没有添加任何音频设备输入。这是我设置 session 的方式:
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 使用率?
最佳答案
作为更大的性能优化,我是否建议不要使用覆盖在 AVCaptureVideoPreviewLayer 上的非透明 OpenGL ES 内容?相反,您将获得更好的渲染性能,方法是抓取您的相机源,将其作为纹理上传以在您的增强现实内容后面渲染,然后在包含相机纹理的屏幕大小的纹理四边形前面渲染您的内容。
从个人经验来看,渲染不透明的 OpenGL ES 内容会导致严重的减速,因为在这种情况下需要执行合成。获取您的相机帧并将它们显示为 OpenGL ES 场景中的背景将使您可以将 OpenGL ES 托管 View 设置为不透明,这样效率更高。
我有一些 sample code for this作为对象跟踪示例的一部分,但可以在我的开源 GPUImage 的 GPUImageVideoCamera 类中找到更高效的相机捕获和上传版本框架。此外,在我对该框架的代码的分析中,我没有看到在没有将音频输入配置为 session 的一部分的情况下进行音频录制,因此您可以检查我在那里所做的事情。
关于iphone - 没有音频处理的 AVCaptureSession 视频预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804829/