Ios 在应用程序中更改音频会话模式
当应用程序中需要特定行为时,是否可以更改会话类别和选项?例如设置:Ios 在应用程序中更改音频会话模式,ios,cocoa-touch,avaudiosession,Ios,Cocoa Touch,Avaudiosession,当应用程序中需要特定行为时,是否可以更改会话类别和选项?例如设置: [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 据苹果公司称,docs将不接受静音开关 该应用程序录制和播放音频。在播放音频时,应用程序需要遵守静音开关。问题是:我可以这样设置类别吗: [[AVAudioSession sharedInstance] setCat
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
据苹果公司称,docs将不接受静音开关
该应用程序录制和播放音频。在播放音频时,应用程序需要遵守静音开关。问题是:我可以这样设置类别吗:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];
播放开始时,应用程序将遵守静音开关。如果我这样做,这将如何影响路由?苹果文档声明:
会话的类别和模式共同定义了应用程序的运行方式
打算使用音频。通常,您应该设置类别和模式
在激活会话之前。您还可以设置类别或模式
虽然会话处于活动状态,但这将导致
改变路线
可以更改,引用文档: 在iOS中运行的每个应用程序都有一个单独的音频会话,而音频会话又有 单一类别。您可以在播放时更改音频会话的类别 你的应用正在运行 因此,当您希望应用程序更改模式时,只需调用
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)并记录错误以进行调试。
讨论
会话的类别和模式共同定义了
应用程序打算使用音频。通常,您可以设置类别和
激活会话前的模式。您还可以设置类别或名称
会话处于活动状态时的模式,但这会立即导致
改变路线
听起来像是在setActive:error:
之前调用了setCategory:error:
和“-setMode: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.
}
嘿,克里斯,你在这方面有过好运吗?我有过,可以说,很明显,改变“在飞行中”的类别是可能的。我必须再次提取代码,以查看我们是如何实现它的,但它确实起了作用。