ios - 在应用程序中更改 AVAudioSession 模式

标签 ios cocoa-touch avaudiosession

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

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

根据 apple docs 将不支持静音开关。

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

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

播放开始时,应用程序会支持静音开关。如果我这样做,这将如何影响路由?苹果文档状态:

The session's category and mode together define how the application intends to use audio. Typically, you should set the category and mode before activating the session. You may also set the category or mode while the session is active, but this will result in an immediate route change.

最佳答案

可以更改,引用文档:

Each app running in iOS has a single audio session, which in turn has a single category. You can change your audio session’s category while your app is running.

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];
}

如果您想在播放后恢复其他应用程序的音频,您可以发出通知,或者关闭 session 以使其他应用程序的音频继续停止:

- (void)stopAudio {
    if (self.otherAudioShouldResume) {
        [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
    } else {
        [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

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

关于ios - 在应用程序中更改 AVAudioSession 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592728/

相关文章:

ios - 如何在 ios 中发送不覆盖横幅栏的苹果推送通知

ios - 如何解决 iOS 中的 AVCaptureSession 与 AVAudioSession 冲突?

ios - 无法接收 remoteControlReceivedWithEvent - objective-c - ios

iphone - 在 offline_access 权限被贬低后在 iOS 上扩展 Facebook 访问 token 的问题

ios - 当我将它添加到我的项目时,cocoapods 链接器错误

ios - 在 didMove 范围之外添加子项

ios - Swift3 警告 imagePickerController 几乎匹配

objective-c - 为什么 UISplitViewController 不能是 UIWindow 的 rootViewController 属性?

ios - 设置UITabBar的选中项是否调用tabBar :didSelectItem method?

ios7 - iOS 7 背景音频,AudioSession