AVAudioRecorder& AVAudioPlayer - 内置扬声器的声音输出,如何改变?

时间:2010-06-23 18:47:28

标签: iphone

我遇到AVAudioRecorder和AVAudioPlayer的问题。

当我同时使用播放器和录音时(例如,录音时播放声音)声音在安静的内置扬声器中。我搜索了stackoverflow,我找到的就是这段代码:

UInt32 *audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

但这对我没有帮助:( 当我复制它时,我有错误。 如何在底部录制和​​播放扬声器?

我没有像SCLister那样使用任何东西......

提前致谢

最高

6 个答案:

答案 0 :(得分:16)

这有点旧,但是这篇文章对我有帮助,我想为将来可能需要它的其他人更新它。顶部贴出的代码是正确的 - 它将通过手机扬声器播放安静的音频并将其传送到底部的扬声器。代码中有一个小错字,这就是它给出错误的原因。以下是解决此问题的正确代码段:

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

在创建音频播放器/录像机之前,请确保在设置之后立即激活音频会话:

[[AVAudioSession sharedInstance] setActive:YES error:nil];

最后,如果您要同时播放和录制,您可能还需要设置类别和混音功能。这是整个片段,它将设置类别,启用混音,将音频路由到主扬声器,以及激活会话。您只想在应用启动后立即执行此操作。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

NSLog(@"Mixing: %x", propertySetError); // This should be 0 or there was an issue somewhere

[[AVAudioSession sharedInstance] setActive:YES error:nil];

希望能帮助别人!

答案 1 :(得分:2)

我已经在这里回答:How to get AVAudioPlayer output to the speaker

简而言之,请在录制前使用此功能:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];

...并在播放前使用此功能(如果插入扬声器或耳机,则使用此功能)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];

答案 2 :(得分:1)

我发现这个主题的唯一内容是:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
如果要同时播放,必须在录制音频时设置

。试一试并知道。

P.S。确保将AudioToolboxAVFoundation框架添加到项目中,并将它们包含在.m文件中。

答案 3 :(得分:0)

如果您目前正在通过安静的扬声器播放,并希望通过iPhone底部的扬声器播放,请使用以下代码:

UInt32 doChangeDefaultRoute = 1;

AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
                         sizeof (doChangeDefaultRoute),
                         &doChangeDefaultRoute
                         );

答案 4 :(得分:0)

这是一个老问题,但其他答案都没有帮助我......但是,我找到了一个解决方案,我将其发布以备将来参考,以防有人需要。

以下博文中介绍了该解决方案:iOS: Force audio output to speakers while headphones are plugged in

您需要在项目中创建新的Objective-C类AudioRouter。然后将AudioRouter.h导入到您要启动音频功能的类的头文件中。现在在corrseponding .m文件中,在viewDidLoad方法中添加以下行:

AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];

现在您已将音频(例如AVAudioPlayer)输出强制为扬声器!

答案 5 :(得分:0)

自iOS7以来,不推荐使用AudioSessionSetProperty,但以下内容对我有用。

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];