AVAudioSession AVAudioSessionCategoryPlayAndRecord故障

时间:2014-12-23 00:36:22

标签: 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从没有麦克风输入到麦克风输入通知AVAudioSessionRouteChangeReasonCategoryChange时,似乎会发生这种情况。

当应用程序进入后台时(无论是否取消激活音频会话),也会发生配置更改(和故障)。当从后台返回而不停用音频会话时,当AVCaptureSession配置改变时,即当摄像机从前向后切换时,毛刺开始发生。在这种情况下,不触摸音频路由,并且仅在从后台返回而不停用音频会话时发生。路由更改的通知被触发两次。一旦禁用麦克风,再次启用它。

请注意,通过下载Apple的AVCamManual示例,可以轻松重现此行为。将以下内容添加到viewDidLoad的{​​{1}}:

AAPLCameraViewController.m

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

首先将音频类别设置为[[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];
尽管有选项标志,

其他音频停止播放。没有错误。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

[self.captureSession startRunning];
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
[[AVAudioSession sharedInstance] setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

capureSession startRunning运行时,停用当前的AudioSession并在后台恢复其他中断的音乐应用程序,请使用此选项AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation

使用当前的AudioSession重置类别AVAudioSessionCategoryPlayAndRecord,然后再次生效。

我希望它对您有用。