21

当我设置:

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

…录音和播放效果很好,只是播放音量比我在没有录音和设置 PlayAndRecord 的情况下播放相同的声音时低 60% 左右。

我需要获得高音量峰值(以检查用户是否对麦克风吹气),因为我开始了录音会话。但如果没有设置 AVAudio..PlayandRecord,我无法同时播放任何声音。这就是我实现这个命令的原因。

有什么帮助吗?

谢谢克里斯

4

7 回答 7

26

对于遇到相同问题的每个人,请将您的输出重定向到扬声器:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
    sizeof(audioRouteOverride), &audioRouteOverride);

这样可行。

于 2010-02-11T19:20:12.500 回答
25

我今天遇到了这个问题,看来这个答案有点过时了。AudioSessionsSetProperty(...) 现在已弃用。

以下似乎可行,通过扬声器提供全音量,但如果在应用程序运行之前插入耳机,则会自动将音频路由到耳机:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];

如果即使插入耳机,您也希望通过扬声器以全音量播放音频,这也可以:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
于 2013-12-19T16:20:34.573 回答
14

我发现(参见iOS 文档中的清单 7-9 ),上面关于覆盖音频路由的建议解决方案在插入和移除耳机后停止工作。

因此,如果您希望在当前音频会话(iOS 文档中的清单 7-10 )中永久更改音频路由,则可以使用相同的源设置默认音频路由

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
//Set the general audio session category
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryErr];

//Make the default sound route for the session be to use the speaker
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);

//Activate the customized audio session
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];

当然,请确保链接 AudioToolbox 框架并使用

#import <AudioToolbox/AudioServices.h>
于 2011-11-27T20:24:53.490 回答
5

我今天遇到了这个问题,大多数答案似乎不适用于最近的 iOS 更改。Lucian 上面使用 defaultToSpeaker 选项的回答是正确的,尽管在模拟器和设备上的行为似乎仍然不同。对我有帮助的是在一次调用中设置类别、模式和选项,这在 iOS 10+ 中可用,如下所示:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)

使用此音频一直到最大并保持这种状态。

于 2017-11-27T11:46:24.447 回答
3

不要忘记导入语句。对于更有经验的程序员来说可能很明显......

#import <AudioToolbox/AudioServices.h>
于 2010-08-11T09:55:00.853 回答
0

此外,需要通过右键单击 Frameworks -> Add -> Existing Frameworks 将 AudioToolbox 和 AVFoundation 框架添加到您的项目中。

否则可能会出现链接器错误:“_AudioSessionSetProperty”,引用自:-[OpenBook startRecording] in OpenBook.o

于 2011-06-04T17:49:13.690 回答
0

在我的情况下,除了使用 AVAudioSessionCategoryOptionDefaultToSpeaker 选项之外,我还必须删除将音频会话模式从 AVAudioSessionModeDefault 更改为 AVAudioSessionModeMeasurement。

因此,如果您使用的是 AVAudioSessionModeDefault 以外的模式,请小心。

于 2016-10-07T08:36:44.490 回答