AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch 翻译为:AVAudioSession AVAudioSessionCategoryPlayAndRecord 故障。

13

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

我希望从默认扬声器听到音频,并且希望它与其他音频混合在一起。因此,我需要选项AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers

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

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

有没有办法解决这个故障?

当通知由AVAudioSessionRouteChangeReasonCategoryChange从无麦克风输入切换到麦克风输入时,似乎会发生AVAudioSessionRouteChangeReasonRouteConfigurationChange

配置更改(和故障)也会在应用程序进入后台(带或不带取消音频会话)时发生。当从后台返回而没有取消音频会话时,当AVCaptureSession配置更改即相机从前置切换到后置时,故障开始发生。在此情况下,不会触及音频路由,并且仅在从后台返回而没有取消音频会话时才会发生。更改路线的通知将被触发两次。一次是禁用麦克风,另一次是重新启用它。

请注意,通过下载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];

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


我遇到了完全相同的问题。一字不差。这方面有什么新消息吗? - AndroC
对于您最后的示例,即使选项标志已设置,音频仍停止播放。如果在设置类别之前取消激活音频会话([[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];),则音频将继续播放。 并在之后重新激活([[AVAudioSession sharedInstance] setActive:YES error:nil];),同时设置类别[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; - AndroC
1
同样遇到了相同的问题,一直尝试使用PlayAndRecord:https://dev59.com/EZTfa4cB1Zd3GeqPNz7f。同时也尝试通过在录音开始时更改类别来解决问题:https://dev59.com/GpTfa4cB1Zd3GeqPQ3EI。如果您已经找到了任何一种方法的解决方案,请告诉我。 - Cbas
苹果表示,PlayAndRecord的音频故障没有解决方法:https://forums.developer.apple.com/message/74778#74778。所以我猜唯一的选择是改变类别,但这也不起作用?https://dev59.com/GpTfa4cB1Zd3GeqPQ3EI - Cbas
2个回答

7

正如评论中@Cbas指出的那样,一位苹果工作人员已经确认在从仅输出路由切换到输入+输出路由时存在故障,并且该问题没有解决方法。一个可能的解决方法是总是使用AVAudioSessionCategoryPlayAndRecord类别,即使应用程序没有录音,完全避免从仅输出路由切换到输入输出路由。 此外,如果音频会话类别已经设置为AVAudioSessionCategoryPlayAndRecord,请勿再次设置音频会话类别,否则将会出现故障。


注意:使用AVAudioSessionCategoryPlayAndRecord会禁用锁屏界面上的MPNowPlayingInfoCenter。 - Thanh Pham

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];

当captureSession开始运行时,使用此选项AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation来停用当前的audioSession并恢复其他被中断的后台音乐应用程序。

使用当前的audioSession重置类别AVAudioSessionCategoryPlayAndRecord,然后再次激活。

希望这对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接