与AVAudioSessionCategoryPlayAndRecord结合使用的低录音音量

chr*_*ler 21 audio ios avaudiosession

当我设置:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];
Run Code Online (Sandbox Code Playgroud)

...录制和播放工作正常,只是播放音量比我在没有录制和设置PlayAndRecord时播放相同声音时低约60%.

因为我开始录制会话,我需要获得高音量峰值(以检查用户是否在麦克风中吹气).但是没有设置AVAudio..PlayandRecord,我不能在此期间播放任何声音.这就是我实现这个命令的原因.

任何帮助?

谢克斯

chr*_*ler 26

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

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

这样可行.


Luc*_*orr 24

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

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

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
Run Code Online (Sandbox Code Playgroud)

即使插入了耳机,如果您更愿意通过扬声器以音量播放音频,这也适用:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我在iOS8和iOS9上的问题.谢谢! (2认同)

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

当然要确保链接AudioToolbox框架并使用它导入它

#import <AudioToolbox/AudioServices.h>
Run Code Online (Sandbox Code Playgroud)


小智 5

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

try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)
Run Code Online (Sandbox Code Playgroud)

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