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

Posted

技术标签:

【中文标题】AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?【英文标题】:AVAudioRecorder & AVAudioPlayer - Sound output on internal speaker, how to change? 【发布时间】:2010-06-23 18:47:27 【问题描述】:

我对 AVAudioRecorder 和 AVAudioPlayer 有疑问。

当我同时使用播放器和录音时(例如,在录音时播放声音),声音在安静的内部扬声器中。我搜索了***,我发现的只是这段代码:

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

但这对我没有帮助:( 当我复制粘贴它时,我得到了错误。 如何录制和播放底部的扬声器?

我不使用 SCLister 之类的东西...

提前致谢

最大

【问题讨论】:

【参考方案1】:

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

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

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

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

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

[[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];

希望对某人有所帮助!

【讨论】:

有相当多的 Apple 示例代码显示 error:nil 和 error:NULL ,因此两者都可以使用。它肯定不会引起任何问题。【参考方案2】:

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

简而言之,在录制之前使用它:

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

...并在播放前使用它(如果已插入扬声器或耳机)

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

【讨论】:

【参考方案3】:

关于这个话题我发现的唯一一点是:

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

如果您想同时播放,则必须在录制音频时进行设置。试一试,让我知道。

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

【讨论】:

是的,这是必需的,但我明白了。没有变化:(功能本身还可以,你可以吹麦克风并听到声音,但只能使用内置扬声器。【参考方案4】:

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

UInt32 doChangeDefaultRoute = 1;

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

【讨论】:

【参考方案5】:

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

以下博客文章中描述了该解决方案:iOS: Force audio output to speakers while headphones are plugged in 。

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

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

现在您可以将音频(例如 AVAudioPlayer)输出强制到扬声器!

【讨论】:

【参考方案6】:

AudioSessionSetProperty 自 iOS7 以来已被弃用,但以下内容对我有用。

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

【讨论】:

以上是关于AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?的主要内容,如果未能解决你的问题,请参考以下文章

关于使用 AVAudioPlayer 自动录制和自动播放 AVAudioRecorder

ava.io.InputStream & java.io.FileInputStream

iOS音频与视频的开发- 使用AVAudioRecorder进行录制音频

AVAudioRecorder 从不录音

AVAudioRecorder 不保留

iOS开发简记:录音AVAudioRecorder