在应用程序中更改AVAudioSession模式

7

在应用程序中是否可以在需要特定行为时更改会话类别和选项?例如,设置:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

根据苹果文档,将不支持静音开关。

该应用程序记录并播放音频。在音频播放时,应用程序需要支持静音开关。问题是:我可以这样设置类别吗:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];

当播放开始时,应用程序将遵守静音开关。如果这样做,会对路由产生什么影响?苹果文档指出:

会话的类别和模式共同定义了应用程序使用音频的意图。通常,在激活会话之前,您应该设置类别和模式。您也可以在会话处于活动状态时设置类别或模式,但这将导致立即进行路由更改。


嗨,克里斯,你在这个问题上有什么好的解决办法吗? - Mike
3
我做到了,显然可以“即时”更改类别。我需要再次查看代码以确定我们如何实现它,但它确实起作用。 - Chris
2个回答

7

根据文档,可以改变:

iOS中每个运行的应用程序都有一个音频会话,而音频会话又只有一个类别。您可以在应用程序运行时更改您的音频会话类别。

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/#//apple_ref/doc/constant_group/Audio_Session_Categories

所以,只需要在您想要应用程序更改模式时调用setCategory:方法即可。

例如,您启动应用程序时允许其他应用程序播放声音:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
    (...)
}

当用户在您的UI上按下播放按钮时,切换到播放模式:
- (void)playAudio {
    if ([AVAudioSession sharedInstance].otherAudioPlaying) {
        // you can check and play only if there is no other audio playing
        // maybe use another category, or enable mixing or duck option
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:nil];
    } else {
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    }
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
}

如果您想在播放后恢复其他应用程序的音频,可以发送通知,或者只需关闭会话以使其他应用程序的音频继续停止:
- (void)stopAudio {
    if (self.otherAudioShouldResume) {
        [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
    } else {
        [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

这段代码仅供概述,你可能需要执行更多的功能以实现一个可工作的示例,同时记得检查这些函数的返回值(BOOL)并记录错误以进行调试。


0

基于苹果文档,关于 AVAudioSession -setMode:error:

讨论

会话的类别和模式共同定义了应用程序使用音频的意图。通常,在激活会话之前设置类别和模式。您也可以在会话处于活动状态时设置类别或模式,但这会立即导致路由更改。

看起来 setCategory:error: 和 '-setMode:error:' 通常是在 setActive:error: 之前调用的。但如果在会话处于活动状态时调用这些方法,则音频路由将立即更改。

在我的情况下,

- (void)playAudio
{
   /// call `-setMode:error:` for playing audio
}

- (void)stopAudio
{
   /// call `-setMode:error:` back to original configuration, or set to another mode. It will result in route change immediately.
}

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