与AVAudioSessionCategoryPlayAndRecord组合在一起的低录音量

当我设置:

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

…录音和播放工作正常,只是播放音量比当我只是播放相同的声音,没有logging和设置PlayAndRecord时低60%左右。

我需要获得高音量(为了检查用户是否在麦克风中吹),因此我开始了录音。 但没有设置AVAudio..PlayandRecord,我无法播放任何声音在此期间。 这就是我实施这个命令的原因。

任何帮助?

克里斯

对于所有出现同样问题的人,请将输出redirect到扬声器:

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

这样可行。

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

以下似乎工作,通过扬声器提供完整的音量,但自动路由audio耳机,如果他们在应用程序运行之前插入:

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

而且,即使插入耳机,如果您希望音量以最大音量播放,也可以这样工作:

 [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; 

我发现(参见iOS文档中的清单7-9),上面的覆盖audio路由的build议解决scheme在插入之后停止工作,并且移除耳机。

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

 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> 

不要忘记import声明。 对于更有经验的程序员也许是显而易见的

 #import <AudioToolbox/AudioServices.h> 

此外,还需要通过在框架 – >添加 – >现有框架上右键添加AudioToolbox和AVFoundation框架到您的项目中。

否则可能会得到链接器错误:“_ AudioSessionSetProperty”,引用来自: – OpenBook中的OpenBook开始录制

在我的情况下,除了使用AVAudioSessionCategoryOptionDefaultToSpeaker选项,我必须删除AVAudioSessionModeDefault更改audioSession模式AVAudioSessionModeMeasurement。

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

我今天遇到了这个问题,大部分答案似乎都不适用于最近的iOS变更。 Lucian的上面的答案与defaultToSpeaker选项是正确的,尽pipe似乎在模拟器和设备上的行为有时不一样。 对我有帮助的是在一个呼叫中设置类别,模式和选项,这在iOS 10中是可用的,如下所示:

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

使用这个audio一直到最大,并保持这种方式。