ios - AVAudioSession AVAudioSessionCategoryPlayAndRecord 故障

标签 ios objective-c avfoundation avcapturesession avaudiosession

我想使用 AVCaptureSession 录制带音频的视频。为此,我需要 AudioSessionCategory AVAudioSessionCategoryPlayAndRecord,因为我的应用程序还可以播放带声音的视频。

我希望可以从默认扬声器听到音频,并且我希望它与其他音频混合。所以我需要选项 AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers.

如果我在播放其他音频时执行以下操作,则其他应用的音频中会出现明显的故障:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];

有没有办法消除这个故障?

这似乎发生在 AVAudioSessionRouteChangeReasonRouteConfigurationChange 通知从无麦克风输入到麦克风输入时。

配置更改(和故障)也会在应用进入后台时发生(无论是否停用 Audio Session )。当从后台返回而不停用 Audio Session 时,当 AVCaptureSession 配置更改时,即当相机从前切换到后时,故障开始发生。在这种情况下,音频路由未被触及,并且仅在未停用 Audio Session 的情况下从后台返回时发生。路由更改的通知被触发两次。一次禁用麦克风,一次再次启用。

请注意,通过下载 Apple 的 AVCamManual 示例可以轻松重现此行为。将以下内容添加到 AAPLCameraViewController.mviewDidLoad 中:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
…
session.usesApplicationAudioSession = YES;
session.automaticallyConfiguresApplicationAudioSession = NO;

其他一些奇怪的事情,可能是相关的:

首先将音频类别设置为AVAudioSessionCategoryAmbient并激活它:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];

然后更改类别:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

尽管有选项标志,其他音频仍停止播放。不会抛出任何错误。

最佳答案

正如@Cbas 在评论中指出的那样,Apple 员工已确认从仅输出路由切换到输入+输出路由时存在故障,并且该问题没有解决方法,一个可能的解决方法是完全避免切换从仅输出路由到输入输出路由始终使用 AVAudioSessionCategoryPlayAndRecord 类别,即使应用程序未录制也是如此。 此外,如果 Audio Session 类别已经设置为 AVAudioSessionCategoryPlayAndRecord,请不要再次设置,否则会出现故障。

关于ios - AVAudioSession AVAudioSessionCategoryPlayAndRecord 故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612551/

相关文章:

ios - AV Foundation 动画永远不会开始播放

ios - 在 ScrollView 中使用 2 个垂直堆栈 View ,根据内部 View 增加高度

ios - 如何使用 NSLayoutConstraint 将宽度固定到某些 UIView?

ios - 在后台模式下上传图像

objective-c - UIImage :resizableImageWithCapInsets 创建的崩溃释放图像

html - 如何在 ios 中显示文本和 html 图像链接

cocoa - 使用 AVFoundation/CoreMedia/其他框架检测节拍/起始

ios - CapturePhoto 无法快速工作 3

ios - 引用由另一个函数创建的数组

ios - 成功登录后重新分配 RootViewController