我想使用 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.m
的 viewDidLoad
中:
[[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/