AVAudioSession操纵声音输出

时间:2014-08-05 07:55:57

标签: ios objective-c avfoundation

我正在使用AVSoundSession来配置声音,AVAudioPlayer可以播放不同的声音。 我搜索了很多,找不到任何东西。如何操作输出源?

我需要一个方法SoundManager,我可以在手机扬声器和扬声器之间切换输出。

success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                     error:&error];

使用此功能,我可以将声音传送到扬声器,但没有办法将其移动到手机扬声器。有人可以帮我吗?

1 个答案:

答案 0 :(得分:9)

所以,我找到了使用声音输出进行操作的解决方案。

您可以使用AVAudioSession

初始化声音设置

这样的事情:

session = [AVAudioSession sharedInstance];

BOOL success;
NSError* error;

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

if (!success)  NSLog(@"AVAudioSession error setting category:%@",error);
success = [session setMode:AVAudioSessionModeVoiceChat error:&error];

if (!success)  NSLog(@"AVAudioSession error setting mode:%@",error);

success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];

[session setPreferredOutputNumberOfChannels:0 error:nil];
if (!success)  NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);

success = [session setActive:YES error:&error];
if (!success) NSLog(@"AVAudioSession error activating: %@",error);
else NSLog(@"audioSession active");

[session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];

您设置不要覆盖输出端口。你的应用程序使用默认扬声器播放。据我所知,模式AVAudioSessionModeVoiceChat使用了手机扬声器。这正是我的SIP呼叫者应用程序所需要的。

然后你可以用

覆盖输出端口
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

我是这样做的:

- (void) loudSpeakerOn:(BOOL)isLoudSpeaker{
    [session setActive:NO error:nil];

    BOOL success;
    NSError* error;

    success = [session overrideOutputAudioPort:isLoudSpeaker?AVAudioSessionPortOverrideSpeaker:AVAudioSessionPortOverrideNone error:&error];

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

    [session setActive:YES error:nil];
}