AVAudioSession操纵声音输出

Yev*_*THD 2 objective-c avfoundation ios

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

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

success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                     error:&error];
Run Code Online (Sandbox Code Playgroud)

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

Yev*_*THD 10

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

您可以使用初始化声音设置 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");
Run Code Online (Sandbox Code Playgroud)

[session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];
Run Code Online (Sandbox Code Playgroud)

您设置不覆盖输出端口.你的应用程序使用默认扬声器播放.据我了解的模式AVAudioSessionModeVoiceChat使用手机扬声器.这直接是我的SIP来电应用所需要的.

然后你可以覆盖输出端口

[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

- (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];
}
Run Code Online (Sandbox Code Playgroud)