我正在使用AVCaptureSession在iPhone上的增强现实类型应用中预览视频。由于我还在视频预览之上绘制OpenGL图形,因此该应用程序非常耗能。我想最小化CPU使用以节省电池。
当我使用仪器/能源使用检查应用程序时,我发现相当一部分(约20%)的CPU在音频处理上“浪费”了。如果我删除了捕获会话,则音频处理不会像预期的那样占用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的使用?
答案 0 :(得分:2)
作为更大的性能优化,我是否可以建议不要在AVCaptureVideoPreviewLayer上使用非不透明的OpenGL ES内容?相反,您可以通过抓取相机源,将其作为纹理上传以在渲染增强现实内容后渲染,然后在包含相机纹理的屏幕大小纹理四边形前渲染内容,从而获得更好的渲染性能。
根据个人经验,渲染非透明的OpenGL ES内容会导致严重的减速,因为在这种情况下需要执行合成。在您的OpenGL ES场景中接收相机帧并将其显示为背景将允许您将OpenGL ES主机视图设置为不透明,这样效率会更高。
我有一些sample code for this作为对象跟踪示例的一部分,但是在我的开源GPUImage框架中的GPUImageVideoCamera类中可以找到更高效的摄像头捕获和上传版本。此外,在我对该框架的代码进行概要分析时,我没有看到在没有配置为会话的一部分的音频输入的情况下进行录音,因此您可以检查我在那里做的事情。
答案 1 :(得分:1)
我有同样的问题。我正在使用AV Foundation扫描条形码,对音频没兴趣。然而,大约20%被浪费在"音频处理"我的iPhone 5S。
我为此提交了bug report。欢迎你来欺骗它。