没有音频处理的 AVCaptureSession 视频预览
Posted
技术标签:
【中文标题】没有音频处理的 AVCaptureSession 视频预览【英文标题】:AVCaptureSession video preview without audio processing 【发布时间】:2012-05-29 18:41:38 【问题描述】:我正在使用 AVCaptureSession 在 iPhone 上的增强现实类型应用中预览视频。由于我还在视频预览之上绘制 OpenGL 图形,因此该应用程序非常耗能。我想尽量减少 CPU 的使用以节省电池。
当我使用 Instruments/Energy 使用情况检查应用程序时,我发现有相当一部分(~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 使用率?
【问题讨论】:
【参考方案1】:作为更大的性能优化,我是否建议不要使用覆盖在 AVCaptureVideoPreviewLayer 上的非透明 OpenGL ES 内容?相反,您将获得更好的渲染性能,方法是抓取您的相机源,将其作为纹理上传以在您的增强现实内容后面渲染,然后在包含相机纹理的屏幕大小的纹理四边形前面渲染您的内容。
根据个人经验,渲染不透明的 OpenGL ES 内容会导致严重的减速,因为在这种情况下需要执行合成。接收您的相机帧并将它们显示为 OpenGL ES 场景中的背景,这样您就可以将 OpenGL ES 托管视图设置为不透明,这样效率更高。
我有一些 sample code for this 作为对象跟踪示例的一部分,但是可以在我的开源 GPUImage 框架的 GPUImageVideoCamera 类中找到更高效的相机捕获和上传版本。此外,在我对该框架的代码的分析中,我没有看到没有音频输入配置为会话的一部分的情况下发生的音频录制,因此您可以检查我在那里所做的事情。
【讨论】:
感谢您提供宝贵的信息。我一定会检查你的代码并利用它。再次感谢。 我设法让视频捕获工作,但我仍在读取 10-20% 的 CPU 使用率用于音频处理(图形处理只有 5-8%)。等我搞定了,我会回复你的。 您找到解决方案了吗?【参考方案2】:我也有同样的问题。我正在使用 AV Foundation 扫描条形码,对音频不感兴趣。然而,大约 20% 浪费在我的 iPhone 5S 的“音频处理”上。
我为此提交了bug report。欢迎你欺骗它。
【讨论】:
以上是关于没有音频处理的 AVCaptureSession 视频预览的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AVCaptureSession 上设置音频采样率?
如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession
向 AVCaptureSession 添加音频输入会停止 AVPlayer