首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在app中改变AVAudioSession模式

在app中改变AVAudioSession模式
EN

Stack Overflow用户
提问于 2014-03-23 15:15:50
回答 2查看 9.7K关注 0票数 7

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

代码语言:javascript
运行
复制
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

根据苹果的说法,文档不会尊重无声的开关。

该应用程序记录和播放音频。在音频播放中,应用程序需要尊重无声开关。问题是:我是否可以这样设置类别:

代码语言:javascript
运行
复制
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];

当播放开始,以便应用程序尊重无声开关。如果我这样做了,这将如何影响路由?Apple声明:

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

EN

回答 2

Stack Overflow用户

发布于 2015-08-04 17:41:58

可以修改,引用文档:

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

类别

因此,当您希望应用程序改变模式时,只需调用setCategory:方法即可。

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

代码语言:javascript
运行
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
    (...)
}

当用户按下UI上的play按钮时,切换到播放模式:

代码语言:javascript
运行
复制
- (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];
}

如果您想在播放后恢复另一个应用程序音频,您可以执行通知,或者关闭会话,让其他应用程序音频继续停止:

代码语言:javascript
运行
复制
- (void)stopAudio {
    if (self.otherAudioShouldResume) {
        [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
    } else {
        [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

这段代码只是一个概述,您可能需要执行更多的功能来实现一个工作示例,还记得检查这些函数(BOOL)的返回并记录调试错误。

票数 7
EN

Stack Overflow用户

发布于 2015-11-02 01:55:44

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

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

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

就我而言,

代码语言:javascript
运行
复制
- (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.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22592728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档