代码之家  ›  专栏  ›  技术社区  ›  Jim Hankins

如何在不使用AudioSessionSetProperty的情况下将音频路由到扬声器?

  •  37
  • Jim Hankins  · 技术社区  · 12 年前

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

    以前我做过以下事情:

    -(void)setSpeakerEnabled
    {
        debugLog(@"%s",__FUNCTION__);
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    
        AudioSessionSetProperty (
                             kAudioSessionProperty_OverrideAudioRoute,
                             sizeof (audioRouteOverride),
                             &audioRouteOverride
                             );
    }
    

    试图得到同样的结果,但 without call AudioSessionSet属性 .

    4 回复  |  直到 9 年前
        1
  •  60
  •   Alex Zavatone    9 年前

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

    自iOS 6以来 kAudioSessionProperty_OverrideAudioRoute 在AVAudioSession中用以下方法表示

    - (BOOL)overrideOutputAudioPort:error:
    

    可用值为 AVAudioSessionPortOverrideNone AVAudioSessionPortOverrideSpeaker

    以下是完全通过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以来,音频会话服务C API现在被完全弃用,取而代之的是AVAudioSession。

    更新2

    - (BOOL)overrideOutputAudioPort:error:  
    

    是一个方法,而不是属性,它设置了一个基础 只写 UInt32值。您无法获得当前值,应该将该方法视为设置临时状态。如果音频路由发生更改或中断,该属性将重置为默认值( A音频会话端口溢出无 ). 您可以通过获得中断通知 AVAudioSessionDelegate .

        2
  •  7
  •   Yunus Nedim Mehel    8 年前
    NSError *error;
    [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                       error:&error];    
    if(error)
    { 
        NSLog(@"Error: AudioSession cannot use speakers");
    }
    
        3
  •  2
  •   Robert Mars_win    7 年前
    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区域

        4
  •  0
  •   Greg    9 年前

    Foundrys解决方案与 this blog Mario Diana还允许我升级iOS 7中不推荐使用的音频会话设置代码。我的旧代码是基于 AudioBufferPlayer by Matthijs Hollemans . 请记住添加AVFoundation.framework。