当应用程序中需要特定的行为时,是否可以更改会话类别和选项?例如,设置:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
根据苹果的说法,文档不会尊重无声的开关。
该应用程序记录和播放音频。在音频播放中,应用程序需要尊重无声开关。问题是:我是否可以这样设置类别:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];
当播放开始,以便应用程序尊重无声开关。如果我这样做了,这将如何影响路由?Apple声明:
会话的类别和模式共同定义了应用程序打算如何使用音频。通常,您应该在激活会话之前设置类别和模式。您还可以在会话处于活动状态时设置类别或模式,但这将导致立即更改路由。
发布于 2015-08-04 17:41:58
可以修改,引用文档:
在iOS中运行的每个应用程序都有一个音频会话,而音频会话又有一个类别。您可以更改您的音频会话的类别,而您的应用程序运行。
因此,当您希望应用程序改变模式时,只需调用setCategory:
方法即可。
例如,启动应用程序时允许其他应用程序播放声音:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
(...)
}
当用户按下UI上的play按钮时,切换到播放模式:
- (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)的返回并记录调试错误。
发布于 2015-11-02 01:55:44
基于苹果的文档,关于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.
}
https://stackoverflow.com/questions/22592728
复制相似问题