37

AudioSessionSetProperty可能会成为,我deprecated试图找到一个代码示例,说明如何speaker使用其他方式将音频路由到。

以前我做了以下事情:

-(void)setSpeakerEnabled
{
    debugLog(@"%s",__FUNCTION__);
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideAudioRoute,
                         sizeof (audioRouteOverride),
                         &audioRouteOverride
                         );
}

试图获得相同的结果,但without callAudioSessionSetProperty.

4

4 回答 4

60

在 iOS 的每个版本中,更多的 audioSession 属性都迁移到了 AVFoundation,因此您应该在可用时优先使用这些属性。

由于 iOS 6kAudioSessionProperty_OverrideAudioRoute是通过 AVAudioSession 方法表示的

- (BOOL)overrideOutputAudioPort:error:

可用值是AVAudioSessionPortOverrideNoneAVAudioSessionPortOverrideSpeaker

这是一个完全通过 AVFoundation 配置的示例音频会话:

 - (void)configureAVAudioSession
{
   // Get your app's audioSession singleton object
    AVAudioSession *session = [AVAudioSession sharedInstance];

    // Error handling
    BOOL success;
    NSError *error;

    // set the audioSession category. 
    // Needs to be Record or PlayAndRecord to use audioRouteOverride:  

    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
                             error:&error];

   if (!success) {
       NSLog(@"AVAudioSession error setting category:%@",error);
   }

    // Set the audioSession override
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                          error:&error];
    if (!success) {
        NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
    }

    // Activate the audio session
    success = [session setActive:YES error:&error];
    if (!success) {
        NSLog(@"AVAudioSession error activating: %@",error);
    }
    else {
         NSLog(@"AudioSession active");
    }

}

更新

自 iOS 7.0 起,Audio Session Services C API 现已完全弃用,取而代之的是 AVAudioSession。

更新 2

- (BOOL)overrideOutputAudioPort:error:  

是一种方法,而不是属性,它设置了一个底层的只写UInt32 值。您无法获取当前值,您应该将该方法视为设置临时状态。如果音频路由更改或中断,该属性将重置为其默认值 ( AVAudioSessionPortOverrideNone)。您可以通过 获取中断通知AVAudioSessionDelegate

于 2013-09-15T01:41:05.133 回答
7
NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                   error:&error];    
if(error)
{ 
    NSLog(@"Error: AudioSession cannot use speakers");
}
于 2015-11-25T15:40:08.020 回答
2
let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .spokenAudio, options: .defaultToSpeaker)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
    } catch {
        print("error.")
    }  

// 将此代码粘贴到您的 viewLoad 区域

于 2018-11-07T13:30:22.717 回答
0

Foundry 的解决方案以及 Mario Diana 的这篇博客还允许我升级 iOS 7 中不推荐使用的音频会话设置代码。我的旧代码基于 Matthijs Hollemans的AudioBufferPlayer。记得添加 AVFoundation.framework。

于 2016-06-03T02:00:41.723 回答